在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“解析”现有的PDF文件,您只能每页“读取”它的页面。

这是什么意思?

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


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版本中找到任何对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内容中去除大量附加信息,例如位置坐标。

链接地址: http://www.djcxy.com/p/46729.html

上一篇: Reading PDF content with itextsharp dll in VB.NET or C#

下一篇: c#