¿Existe una biblioteca de código abierto que me ayude a leer/analizar documentos PDF en .Net/C#?Lectura de documentos PDF en .Net
Respuesta
iTextSharp es la mejor opción. Lo usé para hacer una araña para lucene.Net para que pueda rastrear PDF.
using System;
using System.IO;
using iTextSharp.text.pdf;
using System.Text.RegularExpressions;
namespace Spider.Utils
{
/// <summary>
/// Parses a PDF file and extracts the text from it.
/// </summary>
public class PDFParser
{
/// BT = Beginning of a text object operator
/// ET = End of a text object operator
/// Td move to the start of next line
/// 5 Ts = superscript
/// -5 Ts = subscript
#region Fields
#region _numberOfCharsToKeep
/// <summary>
/// The number of characters to keep, when extracting text.
/// </summary>
private static int _numberOfCharsToKeep = 15;
#endregion
#endregion
#region ExtractText
/// <summary>
/// Extracts a text from a PDF file.
/// </summary>
/// <param name="inFileName">the full path to the pdf file.</param>
/// <param name="outFileName">the output file name.</param>
/// <returns>the extracted text</returns>
public bool ExtractText(string inFileName, string outFileName)
{
StreamWriter outFile = null;
try
{
// Create a reader for the given PDF file
PdfReader reader = new PdfReader(inFileName);
//outFile = File.CreateText(outFileName);
outFile = new StreamWriter(outFileName, false, System.Text.Encoding.UTF8);
Console.Write("Processing: ");
int totalLen = 68;
float charUnit = ((float)totalLen)/(float)reader.NumberOfPages;
int totalWritten = 0;
float curUnit = 0;
for (int page = 1; page <= reader.NumberOfPages; page++)
{
outFile.Write(ExtractTextFromPDFBytes(reader.GetPageContent(page)) + " ");
// Write the progress.
if (charUnit >= 1.0f)
{
for (int i = 0; i < (int)charUnit; i++)
{
Console.Write("#");
totalWritten++;
}
}
else
{
curUnit += charUnit;
if (curUnit >= 1.0f)
{
for (int i = 0; i < (int)curUnit; i++)
{
Console.Write("#");
totalWritten++;
}
curUnit = 0;
}
}
}
if (totalWritten < totalLen)
{
for (int i = 0; i < (totalLen - totalWritten); i++)
{
Console.Write("#");
}
}
return true;
}
catch
{
return false;
}
finally
{
if (outFile != null) outFile.Close();
}
}
#endregion
#region ExtractTextFromPDFBytes
/// <summary>
/// This method processes an uncompressed Adobe (text) object
/// and extracts text.
/// </summary>
/// <param name="input">uncompressed</param>
/// <returns></returns>
public string ExtractTextFromPDFBytes(byte[] input)
{
if (input == null || input.Length == 0) return "";
try
{
string resultString = "";
// Flag showing if we are we currently inside a text object
bool inTextObject = false;
// Flag showing if the next character is literal
// e.g. '\\' to get a '\' character or '\(' to get '('
bool nextLiteral = false;
//() Bracket nesting level. Text appears inside()
int bracketDepth = 0;
// Keep previous chars to get extract numbers etc.:
char[] previousCharacters = new char[_numberOfCharsToKeep];
for (int j = 0; j < _numberOfCharsToKeep; j++) previousCharacters[j] = ' ';
for (int i = 0; i < input.Length; i++)
{
char c = (char)input[i];
if (input[i] == 213)
c = "'".ToCharArray()[0];
if (inTextObject)
{
// Position the text
if (bracketDepth == 0)
{
if (CheckToken(new string[] { "TD", "Td" }, previousCharacters))
{
resultString += "\n\r";
}
else
{
if (CheckToken(new string[] { "'", "T*", "\"" }, previousCharacters))
{
resultString += "\n";
}
else
{
if (CheckToken(new string[] { "Tj" }, previousCharacters))
{
resultString += " ";
}
}
}
}
// End of a text object, also go to a new line.
if (bracketDepth == 0 &&
CheckToken(new string[] { "ET" }, previousCharacters))
{
inTextObject = false;
resultString += " ";
}
else
{
// Start outputting text
if ((c == '(') && (bracketDepth == 0) && (!nextLiteral))
{
bracketDepth = 1;
}
else
{
// Stop outputting text
if ((c == ')') && (bracketDepth == 1) && (!nextLiteral))
{
bracketDepth = 0;
}
else
{
// Just a normal text character:
if (bracketDepth == 1)
{
// Only print out next character no matter what.
// Do not interpret.
if (c == '\\' && !nextLiteral)
{
resultString += c.ToString();
nextLiteral = true;
}
else
{
if (((c >= ' ') && (c <= '~')) ||
((c >= 128) && (c < 255)))
{
resultString += c.ToString();
}
nextLiteral = false;
}
}
}
}
}
}
// Store the recent characters for
// when we have to go back for a checking
for (int j = 0; j < _numberOfCharsToKeep - 1; j++)
{
previousCharacters[j] = previousCharacters[j + 1];
}
previousCharacters[_numberOfCharsToKeep - 1] = c;
// Start of a text object
if (!inTextObject && CheckToken(new string[] { "BT" }, previousCharacters))
{
inTextObject = true;
}
}
return CleanupContent(resultString);
}
catch
{
return "";
}
}
private string CleanupContent(string text)
{
string[] patterns = { @"\\\(", @"\\\)", @"\\226", @"\\222", @"\\223", @"\\224", @"\\340", @"\\342", @"\\344", @"\\300", @"\\302", @"\\304", @"\\351", @"\\350", @"\\352", @"\\353", @"\\311", @"\\310", @"\\312", @"\\313", @"\\362", @"\\364", @"\\366", @"\\322", @"\\324", @"\\326", @"\\354", @"\\356", @"\\357", @"\\314", @"\\316", @"\\317", @"\\347", @"\\307", @"\\371", @"\\373", @"\\374", @"\\331", @"\\333", @"\\334", @"\\256", @"\\231", @"\\253", @"\\273", @"\\251", @"\\221"};
string[] replace = { "(", ")", "-", "'", "\"", "\"", "à", "â", "ä", "À", "Â", "Ä", "é", "è", "ê", "ë", "É", "È", "Ê", "Ë", "ò", "ô", "ö", "Ò", "Ô", "Ö", "ì", "î", "ï", "Ì", "Î", "Ï", "ç", "Ç", "ù", "û", "ü", "Ù", "Û", "Ü", "®", "™", "«", "»", "©", "'" };
for (int i = 0; i < patterns.Length; i++)
{
string regExPattern = patterns[i];
Regex regex = new Regex(regExPattern, RegexOptions.IgnoreCase);
text = regex.Replace(text, replace[i]);
}
return text;
}
#endregion
#region CheckToken
/// <summary>
/// Check if a certain 2 character token just came along (e.g. BT)
/// </summary>
/// <param name="tokens">the searched token</param>
/// <param name="recent">the recent character array</param>
/// <returns></returns>
private bool CheckToken(string[] tokens, char[] recent)
{
foreach (string token in tokens)
{
if ((recent[_numberOfCharsToKeep - 3] == token[0]) &&
(recent[_numberOfCharsToKeep - 2] == token[1]) &&
((recent[_numberOfCharsToKeep - 1] == ' ') ||
(recent[_numberOfCharsToKeep - 1] == 0x0d) ||
(recent[_numberOfCharsToKeep - 1] == 0x0a)) &&
((recent[_numberOfCharsToKeep - 4] == ' ') ||
(recent[_numberOfCharsToKeep - 4] == 0x0d) ||
(recent[_numberOfCharsToKeep - 4] == 0x0a))
)
{
return true;
}
}
return false;
}
#endregion
}
}
hola ceetheman, intenté usar el código que proporcionó anteriormente ... pero tengo un problema. algunos de los archivos pdf se leen correctamente, pero en algunos archivos pdf recibí el error "Índice fuera de rango" en la función "CheckToken". ¿Puedes ayudarme a resolver esto? – Radhi
Hacer referencia a la fuente de su ejemplo es una buena y educada idea. En este caso, el mismo código fuente se puede encontrar aquí http://www.codeproject.com/KB/cs/PDFToText.aspx – Myster
Tengo problemas con este código, devuelve el gobledegook compuesto por las letras r y n. Usé PDFBox al final. – Myster
Podrías mirar esto: http://www.codeproject.com/KB/showcase/pdfrasterizer.aspx No es completamente gratis, pero se ve muy bien.
Alex
Puede esta ayuda convertir PDF a texto sin formato? Parece que la herramienta la convierte en una imagen. Entonces necesito una biblioteca de OCR :-) – JRoppert
Existe también libHaru
Enlace roto. http: // libharu.org/ – TernaryTopiary
También: "En este momento, libHaru no es compatible con la lectura y edición de archivos PDF existentes y es poco probable que este soporte aparezca alguna vez". ¿Es esto realmente relevante? – TernaryTopiary
iText es la mejor biblioteca que conozco. Originalmente escrito en Java, también hay un puerto .NET.
Ese no es un puerto oficial, y el enlace se rompe de todos modos. El puerto .NET oficial de iText, iTextSharp, se puede encontrar en GitHub: http://github.com/itext/itextsharp –
http://www.c-sharpcorner.com/UploadFile/psingh/PDFFileGenerator12062005235236PM/PDFFileGenerator.aspx es de código abierto y puede ser un buen punto de partida para usted.
He utilizado ITextSharp en el pasado para manipular/dividir y reformar documentos PDF - es bastante sencillo, y también de código abierto.
aspose pdf funciona bastante bien. luego otra vez, usted tiene que pagar por ello
public string ReadPdfFile(object Filename, DataTable ReadLibray)
{
PdfReader reader2 = new PdfReader((string)Filename);
string strText = string.Empty;
for (int page = 1; page <= reader2.NumberOfPages; page++)
{
ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
PdfReader reader = new PdfReader((string)Filename);
String s = PdfTextExtractor.GetTextFromPage(reader, page, its);
s = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(s)));
strText = strText + s;
reader.Close();
}
return strText;
}
¡El único método que funcionó para mí! Gracias amigo! – Crasher
Desde que esta pregunta fue respondida por última vez en 2008, iTextSharp ha mejorado su api dramáticamente. Si descarga la última versión de su API del http://sourceforge.net/projects/itextsharp/, puede usar el siguiente fragmento de código para extraer todo el texto de un pdf en una cadena.
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
namespace PdfParser
{
public static class PdfTextExtractor
{
public static string pdfText(string path)
{
PdfReader reader = new PdfReader(path);
string text = string.Empty;
for(int page = 1; page <= reader.NumberOfPages; page++)
{
text += PdfTextExtractor.GetTextFromPage(reader,page);
}
reader.Close();
return text;
}
}
}
Probablemente no deba llamar a su clase 'PdfTextExtractor' ya que chocará con la de' iTextSharp.text.pdf.parser' – Neil
iTextSharp se ha movido a GitHub: http://github.com/itext/itextsharp –
quizás esos ¿Quién respondió aquí podría ayudar [aquí] (http://stackoverflow.com/q/34531369/1219280)? – Veverke
Eche un vistazo a Docotic.Pdf library. No es necesario que abras el código fuente de tu aplicación (como iTextSharp con licencia viral AGPL 3, por ejemplo).
Docotic.Pdf se puede utilizar para leer archivos PDF y extraer texto con o sin formato. Por favor, eche un vistazo a la muestra que muestra how to extract text from PDFs.
Descargo de responsabilidad: Trabajo para Bit Miracle, proveedor de la biblioteca.
- 1. Lectura de documentos XML de gran tamaño en .net
- 2. Lectura de PDF en C#
- 3. Lectura de un archivo PDF usando iText5 para .NET
- 4. Generación de documentos PDF en ASP.NET
- 5. Lectura de documentos compuestos en C#
- 6. Comentando documentos PDF de LaTeX con lector de PDF
- 7. Ruby: Lectura de archivos PDF
- 8. Lectura de anotaciones en PDF con iText
- 9. Lectura programática de archivos PDF en C#
- 10. Conversión de documentos de MS Word a PDF en ASP.NET
- 11. Problema Desbloqueo de contraseña Documentos PDF protegidos
- 12. Comparar documentos PDF en Adobe Acrobat a través del SDK
- 13. Lectura y decodificación de códigos de barras PDF-417 almacenados en una imagen o archivo PDF desde una aplicación .NET
- 14. ¿Hay alguna API en C# o .net para editar documentos pdf?
- 15. Generando archivo PDF en .NET
- 16. Documentos de índice PDF en Solr desde C# client
- 17. Lectura de archivo PDF usando javascript
- 18. Obtener carpeta Documentos recientes en .NET
- 19. ¿Alguien puede recomendar una buena biblioteca de lectura de PDF para .Net?
- 20. ¿Cómo acceder a hipervínculos en documentos PDF (iPhone)?
- 21. ¿Puedo leer documentos en PDF o Word con Node.js?
- 22. ¿Cómo firmar digitalmente documentos PDF en una aplicación web?
- 23. ¿Lectura de un archivo CSV en .NET?
- 24. Indexar documentos de Word y PDF con Sphinx
- 25. Cómo imprimir documentos PDF desde el Servicio de Windows
- 26. ¿Cómo producir documentos (docx o pdf) desde SQL Server?
- 27. Sistema de gestión de documentos de código abierto en .net?
- 28. Crear un nuevo PDF mediante la fusión de documentos PDF con TCPDF
- 29. PDF Generation usando C# .NET
- 30. jQueryMobile: no se puede vincular a documentos PDF
La respuesta proporcionada por Brock Nusser se parece a la mayoría de la solución hasta a la fecha y debe ser considerada como la respuesta correcta para esta pregunta – ceetheman