【问题标题】:Reading text from PDF in .NET在 .NET 中从 PDF 中读取文本
【发布时间】:2013-12-29 16:26:20
【问题描述】:

我正在尝试使用 iTextSharp 库将 PDF 中的文本读入字符串。

iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(@"C:\mypdf.pdf");
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);
text = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); 
pdfReader.Close();
Console.WriteLine(text);

这通常可以正常工作,但每隔几行就会省略空格,给我留下如下输出:“thisismyoutputwithoutwhitespace”。正确解析的文本似乎与未正确解析的文本相同;相同的文本将始终被错误地解析,这让我认为这是 PDF 中的内容。

【问题讨论】:

    标签: c# .net pdf itext


    【解决方案1】:

    在 PDF 的内容流中没有“单词”的概念。因此,在 iText(Sharp) 的文本提取实现中,有一些启发式方法可以确定如何将字符分组为单词。当 2 个字符之间的距离大于当前字体中空格宽度的一半时,插入空格。

    最有可能的是,在没有空格的情况下提取的文本的单词之间的距离小于“spacewidth / 2”。

    SimpleTextExtractionStrategy.RenderText():

    if (spacing > renderInfo.GetSingleSpaceWidth()/2f){
        AppendTextChunk(' ');
    }
    

    您可以扩展SimpleTextExtractionStrategy 并调整RenderText()

    LocationTextExtractionStrategy 更方便。你只需要覆盖IsChunkAtWordBoundary()

    protected bool IsChunkAtWordBoundary(TextChunk chunk, TextChunk previousChunk) {
        float dist = chunk.DistanceFromEndOf(previousChunk);
        if(dist < -chunk.CharSpaceWidth || dist > chunk.CharSpaceWidth / 2.0f)
            return true;
    
         return false;
    }
    

    您必须进行一些试验才能为您的 PDF 获得好的结果。在您的情况下,“spacewidth / 2”显然太大了。但是如果你把它调整得太小,你会得到误报:单词中会插入空格。

    【讨论】:

    • 非常感谢!这很有帮助。但是,您确定 IsChunkAtBounary() 是可覆盖的吗?我得到一个“无法覆盖,因为它没有被标记为抽象的、虚拟的……”。我创建了一个新类,扩展了 LocationTextExtractionStrategy 并覆盖了该方法。
    • 这似乎是从 Java 到 C# 的移植错误。我将确保在下一个版本中修复此问题。作为一种解决方法,我认为您必须复制 LocationTextExtractionStrategy 代码,从而有效地创建 ITextExtractionStrategy 接口的全新实现。在您的新实现中,您可以调整 isChunkAtWordBoundary 方法。我知道...不是最干净的解决方案。我对 C# 不太熟悉;也许有更多 C# 经验的人可以想到一个更优雅的解决方案。
    • 如果你没有 LocationTextExtractionStrategy 的源代码,你可以在这里找到它(最新版本):sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/…
    • 另请阅读this answer
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多