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

use*_*185 75 c# vb.net pdf itextsharp

如何使用带有Pdfreader类的itextsharp读取PDF内容.我的PDF可能包含纯文本或文本图像.

小智 177

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为解决方案!这对我很有用. (14认同)
  • 为什么要使用.Close()而不是`using(var pdfReader = ...){}` (8认同)
  • 同样,因为它是静态方法,所以ASCIIEncoding.Convert应该是Encoding.Convert。 (2认同)

Jay*_*ggs 19

您无法像使用iTextSharp一样阅读和解析PDF的内容.

来自iTextSharp的SourceForge教程:

您无法使用iText"解析"现有PDF文件,您只能在每页"读取"该页面.

这是什么意思?

pdf格式只是一个画布,其中放置文本和图形而没有任何结构信息.因此,PDF文件中没有任何"iText-objects".在每个页面中可能会有许多"字符串",但您无法使用这些字符串重建短语或段落.可能绘制了许多线条,但您无法根据这些线条检索表格对象.简而言之:使用iText解析PDF文件的内容是不可能的.在新闻组新闻://comp.text.pdf上发布您的问题,也许您会从那些已经构建了可以解析PDF并提取其内容的工具的人那里得到一些答案,但是不要指望能够执行子弹的工具 - 结构化文本的转换.

  • +1感谢您阅读本教程的摘录.这是我见过的关于PDF文件的最详尽的解释(启示,真的).在阅读之前,我曾经认为PDF文件中存在某种类似Word的结构. (4认同)

Chr*_*sic 15

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);
Run Code Online (Sandbox Code Playgroud)

其他答案都没有对我有用,它们似乎都针对iTextSharp的AGPL v5.我再也找不到任何参考SimpleTextExtractionStrategyLocationTextExtractionStrategy在FOSS版本.

与此相关的其他可能非常有用的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

这将从PDF中提取仅文本数据,如果显示的文本Foo(bar)将在PDF中编码,则(Foo\(bar\))Tj此方法将按Foo(bar)预期返回.此方法将从原始pdf内容中删除许多其他信息,例如位置坐标.


Car*_*lin 6

这是一个基于ShravankumarKumar解决方案的VB.NET解决方案.

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

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
Run Code Online (Sandbox Code Playgroud)


小智 5

在我的情况下,我只想要来自PDF文档特定区域的文本,所以我在区域周围使用了一个矩形并从中提取了文本.在下面的示例中,坐标是针对整个页面的.我没有PDF创作工具,所以当需要将矩形缩小到特定位置时,我在坐标处进行了一些猜测,直到找到该区域.

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);
Run Code Online (Sandbox Code Playgroud)

如上述注释所述,生成的文本不保留PDF文档中的任何格式,但我很高兴它确实保留了回车.在我的情况下,文本中有足够的常量,我能够提取我需要的值.