如何从PDF的嵌入式CID字体中提取从字符ID(CID)到字形指令的映射?
我有大量的PDF,其中有些PDF \ ToUnicode CMAP数据有问题,这导致从文件中提取文本时出现问题。
由于渲染的页面看起来还不错,所以我想了解PDF中包含的/ FontFile2流对象(基于OpenType的嵌入式CID类型字体)。仅仅能够将流解析为从CID到字形指令的映射就足够了,而无需了解如何解释指令。
(即使集合中只有大约六种字体,CID也会从一个文件转移到另一个文件。因此,我希望即使在不了解如何解释字形指令的情况下,我通过比较错误的映射和正确的映射,甚至可以仅应用简单的多数规则来确定映射“字形指令”-> Unicode,并使用它来更正单个文件的映射,便能够唯一地标识它们并修复\ ToUnicode映射。 。如果您发现此方法有任何问题,请告诉我!)
This这个问题在本质上是相似的,但是我的问题有不同的侧重点:我只想能够将CID映射到某些全局唯一的签名(例如,描述该字形的指令的哈希值)。
我猜答案隐藏在CID font specification中的某个地方,但是我希望避免阅读它...
其中一个文件是PDF;这里是一些相关的对象:
31 0 obj
<<
/CIDSystemInfo 32 0 R
/CIDToGIDMap /Identity
/Subtype /CIDFontType2
/Type /Font
/W 33 0 R
/FontDescriptor 34 0 R
/DW 1000
/BaseFont /ABCDEE+David,Bold
>>
endobj
34 0 obj
<<
/Descent -265
/FontWeight 700
/StemV 52
/FontName /ABCDEE+David,Bold
/Ascent 735
/ItalicAngle 0
/AvgWidth 521
/FontBBox [-195 -265 1009 735]
/Type /FontDescriptor
/CapHeight 735
/Flags 32
/FontFile2 35 0 R
/MaxWidth 1205
/XHeight 250
>>
endobj
35 0 obj
<<
/Length1 53608
/Length 53608>>
[Omitted Stream]
如果可能的话,我想从[Omitted Stream]
中提取足够的信息,以便能够识别每个CID代码将调用的指令集。
答案 0 :(得分:0)
FontFile2 指定为
FontFile2 流 (可选; PDF 1.1)包含TrueType字体程序的流(请参见9.9,“嵌入式字体程序”)。
(ISO 32000-1,表122 –所有字体描述符通用的条目)
FontFile2 - (PDF 1.1) TrueType字体程序,如 TrueType参考手册中所述。此项可能出现在 TrueType 字体字典的字体描述符中,或者(PDF 1.3)出现在 CIDFontType2CIDFont 字典的字体描述符中。
(ISO 32000-1,表126 –各种字体类型的嵌入式字体组织)
因此,可以使用支持TrueType字体的字体库从 FontFile2 流中解析字体文件,从而“查看” PDF的/ FontFile2流对象中的单个字形。适用于您的编程和运行时环境。这样的字体库应该提供“看到”单个字形的方法。
当心: 在PDF的上下文中,不需要所有字体文件功能。这导致许多PDF创建者将字体文件剥离为实际需要的信息。因此,您使用的字体库应该允许一些小的丢失信息。
答案 1 :(得分:0)