2011-01-17 12 views
16

Ich benutze itextsharp auf vb.net, um den Textinhalt aus einer PDF-Datei zu erhalten. Die Lösung funktioniert gut für einige Dateien, aber nicht für andere, auch nicht ganz einfache. Das Problem ist, dass das Token string auf null gesetzt ist (eine Reihe von leeren Kästchen)Itextsharp Textextraktion

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

ich die Länge des Inhalts meassure kann, aber ich kann nicht die tatsächliche Zeichenfolge Inhalt bekommen.

Ich erkannte, dass dies abhängig von der Schriftart der PDF geschieht. Wenn ich ein PDF-Dokument unter Verwendung von Acrobat oder PdfCreator mit Courier (das ist übrigens die Standardschrift in meinem visuellen Studio-Editor) erstelle, kann ich den gesamten Textinhalt abrufen. Wenn das gleiche PDF mit einer anderen Schriftart erstellt wird, habe ich die leeren quadratischen Felder.

Jetzt ist die Frage, wie kann ich Text unabhängig von der Schriftarteinstellung extrahieren?

Dank

Antwort

14

prüfen PdfTextExtractor aus.

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

oder

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

Beide erfordern relativ neue Versionen von iText [Sharp]. Wenn Sie den Content-Stream selbst analysieren, erfinden Sie das Rad an dieser Stelle einfach neu. Ersparen Sie sich ein paar Schmerzen und lassen Sie iText es für Sie tun.

PdfTextExtractor wird alle die verschiedenen Schriftarten/Kodierung Probleme für Sie behandeln ... alle diejenigen, die sowieso behandelt werden können. Wenn Sie den Reader nicht exakt kopieren und einfügen können, sind nicht genügend Informationen in der PDF-Datei vorhanden, um Zeicheninformationen aus dem Inhaltsstream abzurufen.

35

komplementären für Antwort Mark, die mir viel .iTextSharp Implementierung Namespaces und Klassen hilft sind ein bisschen anders als Java-Version

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 für ein vollständiges Beispiel für den Code zu geben, anstatt nur eine einzige Zeile –

+0

ist es möglich, mit iTextSharp Datei auf ‚FTP-Server‘ zu extrahieren? – Munavvar

+0

@Munavvar, leider hatte ich keine solche Erfahrung. aber in der Regel können Sie von FTP in frs Dateistrom oder Binärdateien lesen und füttern die ItextSharp –

4

Hier eine Variante mit iTextSharp.text.pdf.PdfName.ANNOTS und iTextSharp ist. text.pdf.PdfName.CONTENT wenn jemand es braucht.

 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();