Lire le contenu PDF avec la dll itextsharp dans VB.NET ou C#
Comment puis-je lire le contenu PDF avec le itextsharp avec la classe Pdfreader. Mon PDF peut inclure du texte ou des Images du texte.
6 réponses
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();
}
vous ne pouvez pas lire et analyser le contenu D'un PDF en utilisant iTextSharp comme vous le souhaitez.
de iTextSharp SourceForge tutorial :
vous ne pouvez pas 'analyser' un fichier PDF existant en utilisant iText, vous pouvez seulement "lire" page par page.
Qu'est-ce que cela signifie?
le format pdf est juste une toile où le texte et les graphiques sont placés sans tout informations sur la structure. En tant que tel il n'y a pas d'iText-objects 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 utilisant ces chaînes. Y sont probablement un certain nombre de lignes tracées, mais vous ne pouvez pas récupérer un Tableau-objet sur la base de ces lignes. Bref: l'analyse du contenu d'un fichier PDF est Pas possible avec iText. Votre Post question sur le groupe de discussion news: / / comp.texte.pdf et peut-être vous obtiendrez des réponses de personnes qui ont construit des outils qui peuvent analyser PDF et extraire une partie de son contenu, mais ne vous attendez pas à des outils qui conversion à l'épreuve des balles en structure texte.
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 cibler L'AGPL v5 d'iTextSharp. Je n'ai jamais trouvé de référence à SimpleTextExtractionStrategy
ou LocationTextExtractionStrategy
dans la version du logiciel libre.
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;
}
ceci extraira le texte seulement les données du PDF, si le texte affiché est Foo(bar)
il sera codé dans le PDF comme (Foo\(bar\))Tj
, cette méthode retournerait Foo(bar)
comme prévu. Cette méthode permet d'extraire de nombreux renseignements supplémentaires, comme les coordonnées de localisation, du contenu PDF brut.
voici un VB.NET solution basée sur la solution de ShravankumarKumar.
cela ne vous donnera que le texte. Les images sont une histoire différente.
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
dans mon cas je voulais juste le texte d'une zone spécifique du document PDF donc j'ai utilisé un rectangle autour de la zone et j'ai extrait le texte de celui-ci. Dans l'exemple ci-dessous les coordonnées sont pour la page entière. Je n'ai pas D'outils de création PDF donc quand il est venu le temps de rétrécir le rectangle à l'emplacement spécifique, j'ai pris quelques conjectures aux coordonnées jusqu'à ce que la zone a été 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 noté par les commentaires ci-dessus le texte résultant ne maintenir n'importe quel formatage trouvé dans le document PDF, cependant j'ai été heureux qu'il ait préservé les retours de chariot. Dans mon cas, il y avait suffisamment de constantes dans le texte que j'ai pu extraire les valeurs que je voulais.
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