Leggere il contenuto PDF con itextsharp dll in VB.NET o C #

Come posso leggere il contenuto PDF con itextsharp con la class Pdfreader. Il mio PDF può includere testo normale o immagini del testo.

using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System.IO; public string ReadPdfFile(string fileName) { StringBuilder text = new StringBuilder(); if (File.Exists(fileName)) { PdfReader pdfReader = new PdfReader(fileName); for (int page = 1; page <= pdfReader.NumberOfPages; page++) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy); currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); text.Append(currentText); } pdfReader.Close(); } return text.ToString(); } 

Non puoi leggere e analizzare il contenuto di un PDF usando iTextSharp come vorresti.

Dal tutorial SourceForge di iTextSharp:

Non è ansible ‘analizzare’ un file PDF esistente utilizzando iText, è ansible solo ‘leggere’ la pagina per pagina.

Cosa significa questo?

Il formato pdf è solo una canvas dove testo e grafica sono posizionati senza informazioni sulla struttura. In quanto tale, non ci sono “oggetti iText” in un file PDF. In ogni pagina ci sarà probabilmente un certo numero di “stringhe”, ma non è ansible ribuild una frase o un paragrafo usando queste stringhe. Probabilmente esiste un numero di linee tracciate, ma non è ansible recuperare un object tabella in base a queste linee. In breve: l’analisi del contenuto di un file PDF NON è POSSIBILE con iText. Pubblica la tua domanda sulle news del newsgroup: //comp.text.pdf e forse otterrai alcune risposte da persone che hanno creato strumenti in grado di analizzare il PDF ed estrarne alcuni dei contenuti, ma non aspettarti strumenti che eseguiranno un proiettile conversione a prova di testo strutturato.

LGPL / FOSS iTextSharp 4.x

 var pdfReader = new PdfReader(path); //other filestream etc byte[] pageContent = _pdfReader .GetPageContent(pageNum); //not zero based byte[] utf8 = Encoding.Convert(Encoding.Default, Encoding.UTF8, pageContent); string textFromPage = Encoding.UTF8.GetString(utf8); 

Nessuna delle altre risposte mi è stata utile, sembrano tutte rivolte all’AGPL v5 di iTextSharp. Non ho mai trovato alcun riferimento a SimpleTextExtractionStrategy o LocationTextExtractionStrategy nella versione FOSS.

Qualcos’altro che potrebbe essere molto utile in combinazione con questo:

 const string PdfTableFormat = @"\(.*\)Tj"; Regex PdfTableRegex = new Regex(PdfTableFormat, RegexOptions.Compiled); List ExtractPdfContent(string rawPdfContent) { var matches = PdfTableRegex.Matches(rawPdfContent); var list = matches.Cast() .Select(m => m.Value .Substring(1) //remove leading ( .Remove(m.Value.Length - 4) //remove trailing )Tj .Replace(@"\)", ")") //unencode parens .Replace(@"\(", "(") .Trim() ) .ToList(); return list; } 

Questo estrarrà solo i dati del testo dal PDF, se il testo visualizzato è Foo(bar) sarà codificato nel PDF come (Foo\(bar\))Tj , questo metodo restituirebbe Foo(bar) come previsto. Questo metodo eliminerà molte informazioni aggiuntive come le coordinate della posizione dal contenuto PDF grezzo.

Ecco una soluzione VB.NET basata sulla soluzione di ShravankumarKumar.

Questo ti darà SOLO il testo. Le immagini sono una storia diversa.

 Public Shared Function GetTextFromPDF(PdfFileName As String) As String Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName) Dim sOut = "" For i = 1 To oReader.NumberOfPages Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its) Next Return sOut End Function 

Nel mio caso volevo solo il testo da un’area specifica del documento PDF, quindi ho usato un rettangolo intorno all’area e ho estratto il testo da esso. Nell’esempio sotto le coordinate sono per l’intera pagina. Non ho strumenti per la creazione di PDF, quindi quando è arrivato il momento di restringere il rettangolo alla posizione specifica, ho preso alcune ipotesi sulle coordinate fino a quando l’area non è stata trovata.

 Rectangle _pdfRect = new Rectangle(0f, 0f, 612f, 792f); // Entire page - PDF coordinate system 0,0 is bottom left corner. 72 points / inch RenderFilter _renderfilter = new RegionTextRenderFilter(_pdfRect); ITextExtractionStrategy _strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), _filter); string _text = PdfTextExtractor.GetTextFromPage(_pdfReader, 1, _strategy); 

Come notato dai commenti di cui sopra, il testo risultante non mantiene alcuna formattazione trovata nel documento PDF, tuttavia ero felice che conservasse i ritorni a capo. Nel mio caso c’erano abbastanza costanti nel testo che sono stato in grado di estrarre i valori che ho richiesto.

 Public Sub PDFTxtToPdf(ByVal sTxtfile As String, ByVal sPDFSourcefile As String) Dim sr As StreamReader = New StreamReader(sTxtfile) Dim doc As New Document() PdfWriter.GetInstance(doc, New FileStream(sPDFSourcefile, FileMode.Create)) doc.Open() doc.Add(New Paragraph(sr.ReadToEnd())) doc.Close() End Sub