【发布时间】:2021-08-28 23:08:18
【问题描述】:
TrueType 字体程序的内置编码使用称为“cmap”的内部数据结构直接从字符代码映射到字形描述
它继续解释 PDF 处理器的行为取决于字体文件中存在哪些 cmap 子表。
我正在尝试分析使用 fontforge 从 LibreOffice 生成的 PDF 中提取的 .ttf 字体文件。 PDF 使用单字节代码将此字体文件嵌入为简单字体。当我查看fontdrop.info 中的.ttf 文件时,它告诉我“glyphIndexMap”如下:
{"0":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"160":0,"161":0,"162":0,"163":0,"165":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"219":0,"220":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"255":0,"305":0,"338":0,"339":0,"376":0,"402":0,"675":3,"710":0,"711":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"916":0,"937":0,"960":0,"8211":0,"8212":0,"8216":0,"8217":0,"8218":0,"8220":0,"8221":0,"8222":0,"8224":0,"8225":0,"8226":0,"8230":0,"8240":0,"8249":0,"8250":0,"8260":0,"8364":0,"8482":0,"8706":0,"8719":0,"8721":0,"8730":0,"8734":0,"8747":0,"8776":0,"8800":0,"8804":0,"8805":0,"9674":0,"57374":0,"64257":0,"64258":0}
(有趣的是"675":3)
我可以理解这一点,因为字体包含 4 个字形,索引 3 处的字形是 ʣ 字符(十进制 Unicode 点 675 / U+02A3)。
但在 PDF 中,此字符在文本字符串中用作 <01>,并且没有给出其他编码 - 所以根据 PDF 参考,从 <01> 到索引 3 处的字形的映射必须按照到.ttf 文件中的映射:
如果字体字典中没有指定 Encoding 条目,平台 ID 为 1 且编码为 0 的“cmap”子表将用于直接从字符代码映射到字形描述,而不考虑字符名称。这是符号字体的常规约定。
我已确认 PDF 中未指定编码条目。以下是使用 qpdf 提取的 /Font 和 /FontDescriptor 对象:
18 0 obj
<<
/BaseFont /BAAAAA+LiberationSerif
/FirstChar 0
/FontDescriptor 20 0 R
/LastChar 1
/Subtype /TrueType
/ToUnicode 21 0 R
/Type /Font
/Widths [
777
802
]
>>
endobj
20 0 obj
<<
/Ascent 891
/CapHeight 981
/Descent -216
/Flags 4
/FontBBox [
-543
-303
1277
981
]
/FontFile2 23 0 R
/FontName /BAAAAA+LiberationSerif
/ItalicAngle 0
/StemV 80
/Type /FontDescriptor
>>
endobj
那么我如何调查.ttf 文件以确认“平台 ID 为 1 且编码为 0 的“cmap”子表已就位并包含我认为的映射?
【问题讨论】:
-
你能分享有问题的pdf吗?
-
@mkl:是的,链接已添加到问题中。谢谢。
-
该文件包含一个平台 id = 1 和编码 id = 0 的 cmap 表。该表将代码 01 映射到字形索引 01,即页面上显示的“dz”符号。
-
@iPDFdev:是吗?我已按照接受的答案中的建议使用 OT Master Light 来确认存在 (1,0) cmap 子表,但其 GID 条目均为零,我怀疑这与评论“@987654324”有关@" 在 LibreOffice 源代码中。此外,“dz”符号位于字形索引 3。我怀疑 LibreOffice 正在生成损坏的 PDF,从而触发查看器中特定于实现的行为。