2011-01-17 3 views
16

Sto usando itextsharp su vb.net per ottenere il contenuto del testo da un file pdf. La soluzione funziona bene per alcuni file ma non per altri, anche piuttosto semplici. Il problema è che lo stringvalue token viene impostato su null (una serie di caselle quadrati vuoti)Estrazione del testo Itextsharp

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

posso meassure la lunghezza del contenuto ma non può ottenere il contenuto stringa effettiva.

Ho capito che questo succede a seconda del font del pdf. Se creo un pdf utilizzando Acrobat o PdfCreator con Courier (che a proposito è il carattere predefinito nel mio editor di Visual Studio) posso ottenere tutto il contenuto del testo. Se lo stesso pdf è stato creato utilizzando un font diverso, ho ottenuto le caselle quadrate vuote.

Ora la domanda è: come posso estrarre il testo indipendentemente dall'impostazione del carattere?

Grazie

risposta

14

Scopri PdfTextExtractor.

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

o

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

Entrambi richiedono le versioni abbastanza recente di iText [Sharp]. In realtà, l'analisi del flusso di contenuti da solo sta solo reinventando la ruota a questo punto. Risparmiavi un po 'di dolore e lascia che iText lo faccia per te.

PdfTextExtractor gestirà tutti i diversi problemi di carattere/codifica per voi ... tutti quelli che possono essere gestiti comunque. Se non riesci a copiare/incollare correttamente da Reader, non ci sono abbastanza informazioni presenti nel PDF per ottenere informazioni sui personaggi dal flusso di contenuti.

35

complementare per la risposta di Marco che mi aiuta molto .iTextSharp spazi dei nomi di attuazione e le classi sono un po 'diverso da Java versione

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 per dare un esempio completo di codice, piuttosto che una singola linea –

+0

è possibile estrarre file sul 'server ftp' ​​utilizzando iTextSharp? – Munavvar

+0

@Munavvar, sfortunatamente non ho avuto un'esperienza del genere. ma di solito puoi leggere da FTP in frs di File stream o binari e alimentare l'ItextSharp –

4

Qui è una variante con iTextSharp.text.pdf.PdfName.ANNOTS e iTextSharp. text.pdf.PdfName.CONTENT se qualcuno ne ha bisogno.

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