某些 PDF 文件在生成时没有特殊信息,这些信息对于从中成功提取文本至关重要。甚至通过 Adobe 工具。基本上,此类文件不包含字形到字符的映射信息。
此类文件可以正常显示和打印(因为字符的形状已正确定义),但无法正确复制/提取其中的文本(因为没有关于使用的字形/形状含义的信息)。
例如,当使用“最小文件大小”预设时,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.pdf 和bad2.pdf,文本提取仅对两种字体之一成功,而对另一种失败,因为只有一种字体具有/ToUnicode 表。
我,Kurt Pfeifle,最近创建了一个 series of hand-coded PDF files 来展示 PDF 源代码中现有的、有问题的、被操纵的或缺失的 /ToUnicode 表的影响。这些 PDF 包含大量注释,适合在文本编辑器的帮助下进行探索。以上pdffonts 输出示例是在这些手动编码文件的帮助下创建的。 (还有一些显示不同结果的 PDF,感兴趣的读者可能想探索一下……)