7

我正在尝试从一堆 PDF 中挖掘一些文本,其中一些在输出中嵌入了CID 字体

(cid:80)(cid:72)(cid:87)(cid:68)(cid:70)(cid:76)(cid:87)(cid:76)(cid:72)(cid:86)(cid:3)
(cid:177)(cid:3)(cid:71)(cid:72)(cid:191)(cid:81)(cid:72)(cid:71)(cid:3)(cid:69)(cid:92
(cid:3)(cid:56)(cid:49)(cid:3)(cid:43)(cid:68)(cid:69)(cid:76)(cid:87)(cid:68)(cid:87)
(cid:3)(cid:68)(cid:86)(cid:3)(cid:70)(cid:76)(cid:87)(cid:76)(cid:72)(cid:86)(cid:3)
(cid:90)(cid:76)(cid:87)(cid:75)(cid:3)(cid:80)(cid:82)(cid:85)(cid:72)(cid:3)(cid:87)
(cid:75)(cid:68)(cid:81)(cid:3)(cid:20)(cid:19)(cid:3)

当我查看 PDF 中的确切文本片段时,这些字母肯定可以转换为 ASCII:

pdf对应部分的截图

这可能表明蛮力解码会起作用(读取与一堆 CID 代码相对应的文本片段并以这种方式创建映射),但这在许多不同的 PDF 中是否可靠?是否存在从这些 CID 代码到 ASCII 字符的可靠映射,或者是否高度依赖于 PDF 中的字体?如何确定 CID 代码(cid:72)对应的 ASCII 字符?

对于它的价值,我正在使用 PDFminer 提取文本,这似乎是唯一实际报告 CID 代码的工具。如果有更好的工具可以将 PDF 转换为 HTML 或任何其他可解析的文本格式,我愿意接受其他建议!

作为额外的奖励,这个问题似乎与其他一些未回答的问题有关,因此这里有丰富的声誉:

4

1 回答 1

6

虽然您可能可以通过猜测这里的简单示例来做到这一点,但要真正正确地做到这一点,您还需要 2 条额外的信息:

1) 相关字体的 Registry-Ordering-Supplement (ROS) 信息。这通常是“Adobe-Japan1-5”之类的,是存储在字体中的信息属性。ROS 决定如何解释 CID。一种字体中的给定 CID 不一定与另一种字体中的 CID 相同,除非 ROS 相同。也就是说:Adobe-Japan1-5 中的 CID12345 与 Adob​​e-GB1-3 中的 CID12345 形状不一样!

2) 有了 ROS 信息,选择一个兼容的 CMap 并通过它进行解码。ASCII 有点短视;我会选择 Unicode,其中 ASCII 是一个子集。您可以在https://github.com/adobe-type-tools/cmap-resources找到 Adob​​e 定义的 ROS 的 CMap 文件

有关直接从发明者那里获得的 CID 和 CMap 的更多信息,请访问http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5014.CIDFont_Spec.pdf

于 2014-06-07T00:11:42.913 回答