在VB.NET或C#中使用itextsharp dll读取PDF内容

如何使用Pdfreader类与itextsharp读取PDF内容。 我的PDF可能包括纯文本或图像的文字。

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

你不能像使用iTextSharp一样阅读和分析PDF的内容。

从iTextSharp的SourceForge教程 :

您不能使用iText“parsing”现有的PDF文件,您只能每页“读取”它的页面。

这是什么意思?

PDF格式只是一个放置文本和graphics的canvas,没有任何结构信息。 因此,PDF文件中没有任何“iText对象”。 在每个页面中可能会有一些“string”,但是不能用这些string来重build短语或段落。 可能绘制了许多线条,但不能根据这些线条检索表格对象。 简而言之:parsingPDF文件的内容对于iText来说是不可能的。 在新闻组新闻上发布你的问题://comp.text.pdf,也许你会得到一些人已经build立的工具,可以parsingPDF和提取其内容的一些答案,但不要指望工具,将执行子弹无法转换为结构化文本。

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

没有其他答案对我有用,他们似乎都瞄准了iTextSharp的AGPL v5。 我永远无法在FOSS版本中find任何对SimpleTextExtractionStrategyLocationTextExtractionStrategy引用。

其他的东西可能是非常有用的,

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

这将从PDF中提取纯文本数据,如果显示的文本是Foo(bar) ,它将在PDF中被编码为(Foo\(bar\))Tj ,该方法将按照预期返回Foo(bar) 。 该方法将从原始pdf内容中去除大量附加信息,例如位置坐标。

这是一个基于ShravankumarKumar解决scheme的VB.NET解决scheme。

这只会给你的文字。 图像是一个不同的故事。

 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 

就我而言,我只是想从PDF文档的特定区域的文本,所以我用了一个矩形周围的区域,并从中提取文本。 在下面的示例中,坐标是针对整个页面的。 我没有PDF制作工具,所以当它缩小矩形到特定的位置时,我在坐标处进行了一些猜测,直到find该区域。

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

正如上述评论所指出的那样,得到的文本没有保留在PDF文档中find的任何格式,但是我很高兴它确实保留了回车。 在我的情况下,在文本中有足够的常量,我能够提取我需要的值。

 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