解码CID字体编码为等价的ASCII字符
我正在尝试从一堆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码:
这可能意味着用蛮力解码是可行的(也就是说,读取一小段与一堆CID代码对应的文本,然后创建一个映射),但这样在不同的PDF文件中是否可靠呢?这些CID代码和ASCII字符之间有没有可靠的映射,还是说这会高度依赖于PDF中的字体?我该如何确定像(cid:72)
这样的CID代码对应哪个ASCII字符呢?
顺便提一下,我正在使用PDFminer来提取文本,这似乎是唯一一个能实际报告CID代码的工具。如果有更好的工具可以将PDF转换成HTML或其他可解析的文本格式,我也很乐意听听其他建议!
另外,这个问题似乎和一些其他的未回答问题有关,所以这里有很高的声望奖励:
1 个回答
虽然你可能可以通过猜测来处理这里的简单例子,但要真正正确地做到这一点,你需要额外的两条信息:
1) 你需要知道这个字体的注册顺序补充信息(ROS)。这通常是类似于“Adobe-Japan1-5”这样的字符串,它是存储在字体中的一个信息属性。ROS决定了CID(字符标识符)应该如何被解释。一个字体中的某个CID不一定和另一个字体中的同样CID是一样的,除非它们的ROS是相同的。换句话说:在Adobe-Japan1-5中的CID12345和在Adobe-GB1-3中的CID12345是不同的形状!
2) 拿到ROS信息后,选择一个兼容的CMap(字符映射表)并通过它进行解码。ASCII有点局限;我建议使用Unicode,因为ASCII是Unicode的一个子集。你可以在https://github.com/adobe-type-tools/cmap-resources找到Adobe定义的ROS的CMap文件。
关于CID和CMap的更多信息,可以直接从发明者那里获取,链接在这里:http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5014.CIDFont_Spec.pdf