【问题标题】:Extracting text from PDF with iTextSharp is not working for some PDF使用 iTextSharp 从 PDF 中提取文本不适用于某些 PDF
【发布时间】:2016-01-28 18:19:42
【问题描述】:

我正在使用以下代码通过 iTextSharp 从 PDF 文件的第一页中提取文本:

public static string ExtractTextFromPDFFirstPage(string fileName)
{
    string text = null;
    using (var pdfReader = new PdfReader(fileName))
    {
        ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();

        text = PdfTextExtractor.GetTextFromPage(pdfReader,1,strategy);

        text = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text)));

    }
    return text;
}

它适用于许多 PDF,但不适用于其他一些。

工作 PDF:http://data.hexagosoft.com/LFBO.pdf

PDF 无效:http://data.hexagosoft.com/LFBP.pdf

这两个 PDF 似乎非常相似,但一个有效,另一个无效。 我想他们的生产者标签不一样的事实是这里的一个线索。 另一个线索是,此功能适用于没有图表的 PDF 的任何其他页面。

我也尝试过 ghostscipt,但没有成功。

Encoding 行似乎也没用。

如何使用 iTextSharp 提取非工作 PDF 第一页的文本?

谢谢

【问题讨论】:

  • 两个链接都返回 503 错误...
  • 抱歉,filebin.ca 似乎不可靠......我将文件托管在其他地方并编辑了我的消息
  • 与您的问题没有直接关系,但完全删除了 text = Encoding.UTF8.GetString... 行,因为它没有按照您的想法执行。 See this for more.

标签: c# pdf itextsharp pdftotext


【解决方案1】:

这两个文档在其 Encoding/Differences 数组中都使用带有非官方字形名称的字体,并且两者都不使用 ToUnicode 映射。字形命名似乎有些直截了当:MT 前缀后面的数字是所用字形的 ASCII 码。

第一个文档有效,因为映射根本没有改变,iText 将使用默认编码(我猜):

/Differences[65/MT65/MT66/MT67 71/MT71/MT72/MT73 76/MT76 78/MT78 83/MT83]

另一个文档确实改变了映射:

/Differences [2 /MT76 /MT105 /MT103 /MT104 /MT116 /MT110 /MT32 /MT97 /MT100 /MT115 /MT58 ]

这意味着:例如字符代码 2 应该映射到名为 MT76 的字形,这是一个 iText 不知道的非官方/私有字形名称,因此它没有更多信息,但字符代码 2 并将使用此代码作为最终结果(我猜)。

如果不为 MT 前缀字形名称实现逻辑,就不可能从该文档中获取正确的文本。无论如何,都没有定义以 MT 后跟一个整数开头的字形名称可以映射到 ASCII 值...这只是偶然或由字体设计器/创建工具实现的,无论它来自哪里。

【讨论】:

  • 感谢您的回答。这是否意味着无法从此文件中提取文本?为什么从同一文档的其他页面中提取文本有效?
  • 仅通过明确遵循未记录和未指定的逻辑:MT{ASCII}。第一个文件有效,因为例如。 65映射到MT65,66映射到MT66……字符代码与映射的ASCII值相同。第二个文件不是这样:2 到 MT76,3 到 MT105,...
  • 那么,有没有办法手动创建映射?我怎样才能做到这一点 ?我假设我需要从中提取文本的所有其他文件都具有相同的自定义映射。
  • 我必须承认我根本不熟悉 iText。所以我无法回答是否以及如何使用自定义字形名称,抱歉。
【解决方案2】:

第二个 PDF (LFBP.pdf) 包含从字形到文本的不正确映射,即您看到正确的字形,但在生成此 PDF 期间由于某种原因未正确编码文本表示。如果您有很多这样的文件,那么工作方法可能是:

  • 在提取文本时通过搜索应该出现在每个页面上的一些短语来检测损坏的页面,例如“服务”
  • 使用 OCR 和 Tesseract with .NET Wraper 等工具分别处理这些页面

【讨论】:

  • 我已经使用 ByteScout PDF Multitool 实用程序尝试了这个 LFBP.pdf(OCR 模式在 Repair Broken Fonts + 选择了法语),它适用于非旋转文本,但旋转文本不适用于 OCR 。注意 - 我隶属于 ByteScout
猜你喜欢
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多