2011-01-17 17 views
16

Estoy usando itextsharp en vb.net para obtener el contenido de texto de un archivo pdf. La solución funciona bien para algunos archivos pero no para otros incluso simples. El problema es que el stringvalue token se establece en null (un conjunto de cajas cuadradas vacías)extracción de texto Itextsharp

token = New iTextSharp.text.pdf.PRTokeniser(pageBytes) 
    While token.NextToken() 
     tknType = token.TokenType() 
     tknValue = token.StringValue 

puedo meassure la longitud del contenido, pero no puedo obtener el contenido real de cuerdas.

Me di cuenta de que esto sucede dependiendo de la fuente del pdf. Si creo un pdf usando Acrobat o PdfCreator con Courier (que por cierto es la fuente predeterminada en mi editor visual studio) puedo obtener todo el contenido de texto. Si el mismo pdf se construye utilizando una fuente diferente, obtuve los cuadros cuadrados vacíos.

Ahora la pregunta es, ¿cómo puedo extraer texto independientemente de la configuración de la fuente?

Gracias

Respuesta

14

Echa un vistazo a PdfTextExtractor.

String pageText = 
    PdfTextExtractor.getTextFromPage(myReader, pageNum); 

o

String pageText = 
    PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy()); 

Ambos requieren versiones bastante recientes de iText [Enfocado]. En realidad, el análisis del flujo de contenido es solo reinventar la rueda en este punto. Ahórrese un poco de dolor y deje que iText lo haga por usted.

PdfTextExtractor se encargará de todos los diferentes problemas de fuente/codificación para usted ... todos los que se pueden manejar de todos modos. Si no puede copiar/pegar desde Reader con precisión, entonces no hay suficiente información presente en el PDF para obtener información del carácter de la secuencia de contenido.

35

complementario para la respuesta de la marca que me ayuda mucho .iTextSharp espacios de nombres de implementación y las clases son un poco diferente de la versión de Java

public static string GetTextFromAllPages(String pdfPath) 
    { 
     PdfReader reader = new PdfReader(pdfPath); 

     StringWriter output = new StringWriter(); 

     for (int i = 1; i <= reader.NumberOfPages; i++) 
      output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy())); 

     return output.ToString(); 
    } 
+0

+1 por dar un ejemplo completo del código, en lugar de sólo una sola línea –

+0

es posible extraer el archivo 'servidor ftp' ​​usando iTextSharp? – Munavvar

+0

@Munavvar, lamentablemente no tuve esa experiencia. pero generalmente se puede leer desde FTP en archivos de File stream o binarios y alimentar el ItextSharp –

4

Aquí es una variante con iTextSharp.text.pdf.PdfName.ANNOTS y iTextSharp. text.pdf.PdfName.CONTENT si alguien lo necesita.

 string strFile = @"C:\my\path\tothefile.pdf"; 
     iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile); 
     iTextSharp.text.pdf.PRTokeniser prtTokeneiser; 
     int pageFrom = 1; 
     int pageTo = pdfRida.NumberOfPages; 
     iTextSharp.text.pdf.PRTokeniser.TokType tkntype ; 
     string tknValue; 

     for (int i = pageFrom; i <= pageTo; i++) 
     { 
      iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i); 
      iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS); 

      if(cannots!=null) 
       foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList) 
       { 
        iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number); 

        iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS); 
        if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString)) 
        { 
         string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString(); 
         if (cStringVal.ToUpper().Contains("LOS 8")) 
         { // DO SOMETHING FUN 

         } 
        } 
       } 
     } 
     pdfRida.Close(); 
Cuestiones relacionadas