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.
Ceci devrait être marqué comme la solution ! Cela fonctionne très bien pour moi.
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.
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();
}
Y a-t-il une raison particulière pour que pdfReader.Close() ; se produise à l'intérieur de la boucle for ?
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é.
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.
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.
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
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 ?
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).
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 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.
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.