Lecture de contenu PDF avec itextsharp dll dans VB.NET ou C #

Comment puis-je lire le contenu PDF avec itextsharp avec la classe Pdfreader. Mon PDF peut inclure du texte brut ou des images du texte.

using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System.IO; public ssortingng ReadPdfFile(ssortingng fileName) { SsortingngBuilder text = new SsortingngBuilder(); 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(); } 

Vous ne pouvez pas lire et parsingr le contenu d’un PDF en utilisant iTextSharp comme vous le souhaitez.

Du tutoriel SourceForge de iTextSharp:

Vous ne pouvez pas “parsingr” un fichier PDF existant en utilisant iText, vous ne pouvez le “lire” que par page.

Qu’est-ce que ça veut dire?

Le format pdf est juste une canvas où le texte et les graphiques sont placés sans aucune information de structure. En tant que tel, il n’y a pas d’objects iText dans un fichier PDF. Dans chaque page, il y aura probablement un certain nombre de «chaînes», mais vous ne pouvez pas reconstruire une phrase ou un paragraphe à l’aide de ces chaînes. Il existe probablement un certain nombre de lignes dessinées, mais vous ne pouvez pas récupérer un object Table basé sur ces lignes. En bref: parsingr le contenu d’un fichier PDF n’est PAS POSSIBLE avec iText. Postez votre question sur le newsgroup news: //comp.text.pdf et vous obtiendrez peut-être des réponses de personnes qui ont construit des outils capables d’parsingr des fichiers PDF et d’en extraire certains contenus, mais ne vous attendez pas à ce que des outils effectuent une balle. conversion à l’épreuve du texte structuré.

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); ssortingng textFromPage = Encoding.UTF8.GetSsortingng(utf8); 

Aucune des autres réponses ne m’a été utile, elles semblent toutes cibler l’AGPL v5 d’iTextSharp. Je n’ai jamais pu trouver aucune référence à SimpleTextExtractionStrategy ou LocationTextExtractionStrategy dans la version FOSS.

Quelque chose d’autre qui pourrait être très utile en conjonction avec ceci:

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

Cela extraira le texte uniquement des données du PDF, si le texte affiché est Foo(bar) il sera encodé dans le PDF sous la forme (Foo\(bar\))Tj , cette méthode renverrait Foo(bar) comme prévu. Cette méthode supprime de nombreuses informations supplémentaires telles que les coordonnées de localisation du contenu pdf brut.

Voici une solution VB.NET basée sur la solution de ShravankumarKumar.

Cela ne vous donnera que le texte. Les images sont une autre histoire.

 Public Shared Function GetTextFromPDF(PdfFileName As Ssortingng) As Ssortingng 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 

Dans mon cas, je voulais juste le texte d’une zone spécifique du document PDF, j’ai donc utilisé un rectangle autour de la zone et en ai extrait le texte. Dans l’exemple ci-dessous, les coordonnées correspondent à la page entière. Je n’ai pas d’outils de création de fichiers PDF, alors quand est venu le temps de réduire le rectangle à l’endroit spécifique, j’ai pris quelques suppositions aux coordonnées jusqu’à ce que la zone soit trouvée.

 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); ssortingng _text = PdfTextExtractor.GetTextFromPage(_pdfReader, 1, _strategy); 

Comme indiqué dans les commentaires ci-dessus, le texte résultant ne conserve aucune des mises en forme trouvées dans le document PDF, mais j’étais heureux qu’il conserve les retours chariot. Dans mon cas, il y avait suffisamment de constantes dans le texte pour pouvoir extraire les valeurs requirejses.

 Public Sub PDFTxtToPdf(ByVal sTxtfile As Ssortingng, ByVal sPDFSourcefile As Ssortingng) 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