首页 > 解决方案 > 如何在 PDF 的 /FontFile2 流对象中“查看”单个字形?

问题描述

如何提取从字符 ID (CID) 到 PDF 嵌入 CID 字体的字形指令的映射?

一些背景

我收集了大量的 PDF,其中一些有错误的 \ToUnicode CMAP 数据,这会导致从文件中提取文本时出现问题。

由于呈现的页面看起来不错,我想了解 PDF 中包含的 /FontFile2 流对象(基于 OpenType 的嵌入式 CID 类型字体)。仅仅能够将流解析为从 CID 到字形指令的映射就足够了,而无需了解如何解释指令。

(CID 在集合中不断从一个文件转移到下一个文件,即使只有大约六种字体左右。所以我希望,即使不了解如何解释字形指令,我也能通过比较错误和正确的映射来唯一地识别它们并修复 \ToUnicode 映射,甚至可能只是应用简单的多数规则来确定映射“字形指令”-> Unicode,并使用它来更正单个文件的映射。如果你看到这种方法有任何问题,请告诉我!)

到目前为止我尝试过的

这个问题在本质上是相似的,但我的问题有一个不同的重点:我只想能够将 CID 映射到一些全球唯一的签名(例如描述该字形的指令的哈希值)。

我猜答案隐藏在CID 字体规范中的某个地方,但我希望避免阅读它......

具体例子

其中一个文件是 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 代码将调用哪一组指令。

标签: pdffonts

解决方案


Acrobat DC Pro 有一个名为 Preflight 的工具,它对许多不同的事情都非常强大,它有一个选项“浏览所有字体的内部结构”。这实际上允许人们快速、直观地检查嵌入的字体流。这对于与编写代码来解析嵌入式字体程序一起使用很有用,它无法告诉您编写解析器所需知道的所有内容,但它肯定有助于“查看”字形或四处寻找字体作为学术练习。

截屏.

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


推荐阅读