82 votes

Lire le contenu d'un PDF avec la dll itextsharp en VB.NET ou C#

Comment lire le contenu d'un PDF avec la classe Pdfreader d'itextsharp. Mon PDF peut contenir du texte brut ou des images du texte.

0 votes

ITextSharp s'appelle désormais " iText 7 pour .NET " ou " itext7-dotnet " sur github : enlace . Il est recommandé d'ajouter itext7 avec Nuget à votre solution.

192voto

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

16 votes

Ceci devrait être marqué comme la solution ! Cela fonctionne très bien pour moi.

1 votes

Y a-t-il une raison particulière pour que pdfReader.Close() ; se produise à l'intérieur de la boucle for ?

10 votes

Pourquoi utiliser .Close() et non pas using (var pdfReader = ...) {}

19voto

Jay Riggs Points 30783

Vous ne pouvez pas lire et analyser le contenu d'un PDF en utilisant iTextSharp comme vous le souhaiteriez.

De la part d'iTextSharp Tutoriel SourceForge :

Vous ne pouvez pas "analyser" un fichier PDF existant en utilisant iText, vous ne pouvez que le "lire". page par page.

Qu'est-ce que cela signifie ?

Le format pdf est juste un canevas où texte et les graphiques sont placés sans aucune information sur la structure. En tant que tel il n'y a pas d'objets iText dans un fichier PDF. fichier PDF. Dans chaque page, il y aura il y aura probablement un certain nombre de 'Strings', mais mais vous ne pouvez pas reconstruire une phrase ou un paragraphe en utilisant ces chaînes. Il y a y a probablement un certain nombre de lignes tracées, mais vous ne pouvez pas récupérer un objet Tableau à partir de ces lignes. En bref : l'analyse syntaxique du contenu d'un fichier PDF est PAS POSSIBLE avec iText. Postez votre question sur le newsgroup news://comp.text.pdf et peut-être que vous vous obtiendrez peut-être des réponses de personnes qui ont construit des outils qui peuvent analyser le PDF et extraire une partie de son contenu, mais ne vous attendez pas à des outils qui effectueront une conversion infaillible en texte structuré. structuré.

17voto

Chris Marisic Points 11495

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

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

Une autre chose qui pourrait être très utile en conjonction avec ceci :

const string PdfTableFormat = @"\(.*\)Tj";
Regex PdfTableRegex = new Regex(PdfTableFormat, RegexOptions.Compiled);

List<string> ExtractPdfContent(string rawPdfContent)
{
    var matches = PdfTableRegex.Matches(rawPdfContent);

    var list = matches.Cast<Match>()
        .Select(m => m.Value
            .Substring(1) //remove leading (
            .Remove(m.Value.Length - 4) //remove trailing )Tj
            .Replace(@"\)", ")") //unencode parens
            .Replace(@"\(", "(")
            .Trim()
        )
        .ToList();
    return list;
}

Cela permettra d'extraire les données en texte seul du PDF si le texte affiché est Foo(bar) il sera encodé dans le PDF comme (Foo\(bar\))Tj cette méthode renverrait Foo(bar) comme prévu. Cette méthode élimine beaucoup d'informations supplémentaires, comme les coordonnées de l'emplacement, du contenu brut du PDF.

1 votes

Vous avez raison, avant la version 5.x.x l'extraction de texte était présente dans iText seulement comme preuve de concept et dans iTextSharp pas du tout. Ceci étant dit, le code que vous présentez ne fonctionne que dans des PDFs très primitifs (utilisant des polices avec un encodage ASCII'ish et Tj comme seul opérateur de dessin de texte). Il peut être utilisable dans des environnements très contrôlés (dans lesquels vous pouvez vous assurer de n'obtenir que des PDF aussi primitifs) mais pas en général.

0 votes

L'expression Regex correcte est : (?<=()(.* ?)(?=) Tj)

8voto

Carter Points 3877

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

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

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

0 votes

Lorsque j'essaie de le faire sur mon PDF, le message d'erreur suivant s'affiche : "Value cannot be null. Nom du paramètre : valeur". Une idée de la raison de ce message ?

0 votes

SOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its). J'ai également trouvé une solution à cette erreur. Si je sors de la boucle et analyse les pages individuelles, cela fonctionne sur une page mais pas sur l'autre. La seule différence entre les deux est que la page qui pose problème contient des images (dont je n'ai pas besoin).

0 votes

Si vous souhaitez consulter le PDF, je peux vous l'envoyer.

5voto

voidmain Points 1309

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 j'ai extrait le texte de celle-ci. Dans l'exemple ci-dessous, les coordonnées correspondent à la page entière. Je n'ai pas d'outils de création de PDF, donc quand il s'est agi de réduire le rectangle à l'emplacement spécifique, j'ai fait quelques suppositions sur les 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);
string _text = PdfTextExtractor.GetTextFromPage(_pdfReader, 1, _strategy);

Comme indiqué dans les commentaires ci-dessus, le texte résultant ne conserve aucune des mises en forme du document PDF, mais je suis heureux qu'il ait conservé les retours chariot. Dans mon cas, il y avait suffisamment de constantes dans le texte pour que je puisse extraire les valeurs dont j'avais besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X