如何“查看” PDF的/ FontFile2流对象中的单个字形?

时间:2019-03-29 15:04:51

标签: pdf fonts

  

如何从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代码将调用的指令集。

2 个答案:

答案 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)

Acrobat DC Pro具有一个称为Preflight的工具,该工具对许多不同的功能都非常强大,并且具有“浏览所有字体的内部结构”选项。实际上,这使人们可以快速直观地检查嵌入式字体流。结合使用代码来解析嵌入式字体程序很有用,它无法告诉您编写解析器所需的一切,但是“查看”字形或戳戳肯定有帮助。字体作为学术练习。

screenshot

如果您还没有的话,最好先验证字体是否有问题,以及所使用的“文本提取”工具是否存在缺陷。例如。尝试使用替代的PDF软件进行文本提取。