La respuesta proporcionada por las miradas Brock NUSSER como la solución más arriba-hasta la fecha y debe ser considerada como la respuesta correcta para esta pregunta
ceetheman
ITextSharp más actualizado responde aquí ya que esta pregunta está cerrada.
VDWWD
Respuestas:
119
Desde que se respondió esta pregunta por última vez en 2008, iTextSharp ha mejorado su API de forma espectacular. Si descarga la última versión de su api desde 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;
namespacePdfParser
{
publicstaticclassPdfTextExtractor
{
publicstaticstringpdfText(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;
}
}
}
hola ceetheman, intenté usar el código que proporcionaste anteriormente ... pero tengo un problema. algunos de los archivos pdf se leen correctamente, pero en algunos archivos pdf aparece el error "Índice fuera de rango" en la función "CheckToken". ¿puedes ayudarme a resolver esto?
Radhi
18
Hacer referencia a la fuente de su ejemplo es una idea buena y educada. En este caso, el mismo código fuente se puede encontrar aquí codeproject.com/KB/cs/PDFToText.aspx
Myster
2
Tengo problemas con este código, devuelve gobledegook formado por las letras r y n. Usé PDFBox al final.
Myster
Qué raro ... Conecté mi pdf y obtuve 1627 líneas vacías en mi archivo de texto ...
Ortund
1
La respuesta proporcionada por Brock Nusser parece la solución más actualizada y debe considerarse como la respuesta correcta para esta pregunta.
ceetheman
6
publicstringReadPdfFile(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;
}
Ese no es un puerto oficial y el enlace está roto de todos modos. El puerto .NET oficial de iText, iTextSharp, se puede encontrar en GitHub: github.com/itext/itextsharp
¿Puede esto ayudar a convertir PDF a texto sin formato? Parece que la herramienta lo convierte en una imagen. Entonces necesito una biblioteca de OCR :-)
Además: "En este momento, libHaru no admite la lectura y edición de archivos PDF existentes y es poco probable que aparezca esta compatibilidad". ¿Es esto realmente relevante?
TernaryTopiary
0
Eche un vistazo a la biblioteca Docotic.Pdf . No requiere que abra el código fuente de su 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. Eche un vistazo al artículo que muestra cómo extraer texto de archivos PDF .
Descargo de responsabilidad: trabajo para Bit Miracle, proveedor de la biblioteca.
Respuestas:
Desde que se respondió esta pregunta por última vez en 2008, iTextSharp ha mejorado su API de forma espectacular. Si descarga la última versión de su api desde 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; } } }
fuente
PdfTextExtractor
ya que chocará con la deiTextSharp.text.pdf.parser
iTextSharp es la mejor apuesta. Lo usé para hacer una araña para lucene.Net para que pudiera 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 } }
fuente
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; }
fuente
PDFClown podría ayudar, pero no lo recomendaría para una aplicación grande o de uso intensivo.
fuente
iText es la mejor biblioteca que conozco. Escrito originalmente en Java, también hay un puerto .NET.
Ver http://www.ujihara.jp/iTextdotNET/en/
fuente
Puedes mirar esto: http://www.codeproject.com/KB/showcase/pdfrasterizer.aspx No es completamente gratis, pero se ve muy bien.
Alex
fuente
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.
fuente
aspose pdf funciona bastante bien. por otra parte, tienes que pagar por ello
fuente
¿yo texteo?
http://www.itextpdf.com/terms-of-use/index.php
Guía
http://www.vogella.com/articles/JavaPDF/article.html
fuente
También está LibHaru
http://libharu.org/wiki/Main_Page
fuente
Eche un vistazo a la biblioteca Docotic.Pdf . No requiere que abra el código fuente de su 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. Eche un vistazo al artículo que muestra cómo extraer texto de archivos PDF .
Descargo de responsabilidad: trabajo para Bit Miracle, proveedor de la biblioteca.
fuente