将 CID 字体代码解码为等效的 ASCII 字符

din*_*ino 7 python fonts pdfminer

我正在尝试从一堆 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)
Run Code Online (Sandbox Code Playgroud)

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

pdf相应部分的截图

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

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

作为一个额外的好处,这个问题似乎与其他一些未回答的问题有关,因此这里有大量的声誉:

dja*_*ude 6

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

1) 相关字体的注册表-订购-补充 (ROS) 信息。这通常类似于“Adobe-Japan1-5”之类的东西,并且是存储在字体中的信息属性。ROS 决定如何解释 CID。一种字体中的给定 CID 不一定与另一种字体中的 CID 相同,除非 ROS 相同。也就是说:Adobe-Japan1-5中的CID12345和Adobe-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