Comment lire PDF le contenu de 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 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 souhaiteriez.
D'après iTextSharp tutoriel de SourceForge :
Vous ne pouvez pas "analyser" un fichier PDF existant à l'aide d'iText, vous ne pouvez que le "lire" page par page).
Qu'est-ce que ça veut dire?
Le format pdf est juste un canevas où du texte et des 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. Dans chaque page, il y aura probablement un certain nombre de "Chaînes", mais vous ne pouvez pas reconstruire une phrase ou une phrase. paragraphe utilisant ces chaînes. Il existe probablement un certain nombre de lignes, mais vous ne pouvez pas récupérer un objet Table à partir de ces lignes. En bref: l'analyse du contenu d'un fichier PDF N'EST PAS POSSIBLE avec iText. Posez 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'analyser PDF et d'extraire une partie de son contenu, mais ne vous attendez pas à des outils qui effectuera une conversion à l'épreuve des balles en texte 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 de iTextSharp. Je n'ai jamais trouvé aucune référence à SimpleTextExtractionStrategy
ou LocationTextExtractionStrategy
dans la version FOSS.
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 extraira uniquement les données textuelles du fichier PDF. Si le texte affiché est Foo(bar)
, il sera codé dans le PDF sous la forme (Foo\(bar\))Tj
, Cette méthode return Foo(bar)
comme prévu Cette méthode supprimera 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 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
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 à l'ensemble. Je n’ai pas d ’PDF outils de création de sorte que le moment venu de réduire le rectangle à l’emplacement 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);
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 trouvées dans le document PDF), mais j’étais content qu’il conserve les retours à la ligne. Dans mon cas, il y en avait assez constantes dans le texte que je pouvais extraire les valeurs que j'avais besoin.
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