【问题标题】:Extracting text from garbled PDF [closed]从乱码PDF中提取文本[关闭]
【发布时间】:2012-08-24 10:32:38
【问题描述】:

我有一个包含有价值文本信息的 PDF 文件。

问题是我无法提取文本,我得到的只是一堆乱码。如果我将文本从 PDF 阅读器复制并粘贴到文本文件中,也会发生同样的情况。甚至 Acrobat Reader 中的 文件 -> 另存为文本 也会失败。

我已经使用了所有可以使用的工具,结果是一样的。我相信这与字体嵌入有关,但我不知道具体是什么?

我的问题:

  • 这个奇怪的文字乱码的罪魁祸首是什么
  • 如何从 PDF 中提取文本内容(以编程方式、使用工具、直接操作位等)?
  • 如何修复 PDF 以防止复制时出现乱码?

【问题讨论】:

  • 我重新设计了这个问题,因为它可以完美契合 SO,确实 PDF 文件是用于自动文本提取的常用文件格式,并且答案已经完美地回答了如何以编程方式检查并修复它(我还可以添加一个带有代码 sn-p 的答案来进行 OCR)。我投票重新提出这个问题,因为它可能对其他开发者有用。

标签: pdf file-format text-analysis


【解决方案1】:

某些 PDF 文件在生成时没有特殊信息,这些信息对于从中成功提取文本至关重要。甚至通过 Adob​​e 工具。基本上,此类文件不包含字形到​​字符的映射信息。

此类文件可以正常显示和打印(因为字符的形状已正确定义),但无法正确复制/提取其中的文本(因为没有关于使用的字形/形状含义的信息)。

例如,当使用“最小文件大小”预设时,Distiller 会生成此类文件。

恐怕除了 OCR 之外,没有其他方法可以从此类文件中检索文本。我们最近发布了how to OCR PDFs in .NET 的指南。


补充原答案

最初的答案提到了“关于使用的字形/形状含义的信息”。此信息应包含在称为/ToUnicode 表的PDF 结构中。每个作为子集嵌入并使用非标准 (Custom) 编码的字体都需要这样的表。

为了快速评估文本内容的可提取性,您可以使用pdffonts 命令行实用程序。这以表格形式打印有关 PDF 使用的每种字体的一系列项目。 /ToUnicode 表的存在由标题为 uni 的列指示。

几个示例输出:

$ kp@mbp:git.PDF101.angea> pdffonts handcoded/textextract/textextract-good.pdf

    name                     type        encoding   emb sub uni object ID
    ------------------------ ----------- ---------- --- --- --- ---------
    BAAAAA+Helvetica         TrueType    WinAnsi    yes yes yes     12  0
    CAAAAA+Helvetica-Bold    TrueType    WinAnsi    yes yes yes     13  0


$ kp@mbp:git.PDF101.angea> pdffonts handcoded/textextract/textextract-bad1.pdf

    name                     type        encoding   emb sub uni object ID
    ------------------------ ----------- ---------- --- --- --- ---------
    BAAAAA+Helvetica         TrueType    WinAnsi    yes yes no      12  0
    CAAAAA+Helvetica-Bold    TrueType    WinAnsi    yes yes no      13  0


$ kp@mbp:git.PDF101.angea> pdffonts handcoded/textextract/textextract-bad2.pdf

    name                     type        encoding   emb sub uni object ID
    ------------------------ ----------- ---------- --- --- --- ---------
    BAAAAA+Helvetica         TrueType    WinAnsi    yes yes yes     12  0
    CAAAAA+Helvetica-Bold    TrueType    WinAnsi    yes yes no      13  0

good.pdf 可让您正确提取两种字体的文本内容,因为两种字体都有一个随附的 /ToUnicode 表。

对于bad1.pdfbad2.pdf,文本提取仅对两种字体之一成功,而对另一种失败,因为只有一种字体具有/ToUnicode 表。

我,Kurt Pfeifle,最近创建了一个 series of hand-coded PDF files 来展示 PDF 源代码中现有的、有问题的、被操纵的或缺失的 /ToUnicode 表的影响。这些 PDF 包含大量注释,适合在文本编辑器的帮助下进行探索。以上pdffonts 输出示例是在这些手动编码文件的帮助下创建的。 (还有一些显示不同结果的 PDF,感兴趣的读者可能想探索一下……)

【讨论】:

  • @SNAG 基本上,此类文件不包含字形到​​字符的映射信息,同时使用非标准(非ASCII'ish)编码;在没有适当的字形到字符映射信息的情况下,许多文本提取器假定一些标准编码并尝试提取。每当这个假设失败时,结果就是垃圾。
  • 我赞成您的回答,并补充了一些信息。我希望你可以接受 :-)
  • 我还投票决定重新打开 OP(由于某种不明原因而关闭)。
  • @KurtPfeifle 当然,感谢您的补充。
  • 在这种情况下,您将如何提取内容或提取字体,然后将它们应用于提取的没有字体的内容?
【解决方案2】:

我遇到了同样的问题。将其上传到 Google Drive,使用 Google Docs 打开并从那里复制文本对我有用。

【讨论】:

  • 更简单的解决方案是:将pdf拉到chrome窗口。您可以复制文本 - 至少我可以
  • 为我工作。这个答案似乎比 OCR 答案更实用(构建某种自动化时除外)。 (gsziszi 的 Chrome 方法对我不起作用)。
  • @gsziszi 您能否将您的评论作为答案?它有效,而且显然比使用 OCR 更实用。谢谢!
  • 因为,此问题已关闭,无法添加更多答案
  • 不像你说的那样为我工作。我尝试通过在 chrome 窗口中打开文件以及将其上传到谷歌驱动器并从那里打开
【解决方案3】:

我向很多人寻求帮助,而 OCR 是解决此问题的唯一方法

【讨论】:

  • 如果您使用 Microsoft Office,OneNote 具有非常不错的 OCR,对我来说,对于表现出上述问题的 PDF 文档,其准确率是 100%。
  • 我喜欢这个解决方案有多疯狂.. :)))))
  • 什么是 OCR。你能解释一下吗?我也有同样的问题。
  • @Sodhisaab 光学字符识别。我用github.com/tesseract-ocr/tesseract
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 2011-10-23
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多