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

时间:2014-06-06 19:24:32

标签: python fonts pdfminer

我试图从一堆PDF中挖掘一些文本,其中一些已在输出中嵌入了CID fonts

(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:

screenshot of corresponding portion of pdf

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

为了它的价值,我extracting the text using PDFminer,它似乎是实际报告CID代码的唯一工具。如果有更好的工具可以将PDF转换为HTML或任何其他可解析的文本格式,我可以接受其他建议!

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

1 个答案:

答案 0 :(得分:2)

虽然你可以通过猜测这个简单的例子做到这一点,但为了真正做到这一点,你需要另外2条信息:

1)相关字体的Registry-Ordering-Supplement(ROS)信息。这通常类似于'Adobe-Japan1-5'或类似的东西,并且是存储在字体中的信息属性。 ROS确定如何解释CID。除非ROS是相同的,否则一种字体中的给定CID不一定与另一种字体中的CID相同。也就是说:Adobe-Japan1-5中的CID12345与Adobe-GB1-3中的CID12345形状不同!

2)使用ROS信息,选择兼容的CMap并通过它进行解码。 ASCII有点短视;我会选择Unicode作为子集的Unicode。您可以在http://sourceforge.net/projects/cmap.adobe/files/

找到Adobe定义的ROS的CMap文件

有关发明人直接提供的CID和CMaps的更多信息,请访问http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5014.CIDFont_Spec.pdf