【问题标题】:How do I inspect the cmap table and subtables in a TrueType font?如何检查 TrueType 字体的 cmap 表和子表?
【发布时间】:2021-08-28 23:08:18
【问题描述】:

PDF Reference 说:

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”子表已就位并包含我认为的映射?

编辑:the PDF in question

【问题讨论】:

  • 你能分享有问题的pdf吗?
  • @mkl:是的,链接已添加到问题中。谢谢。
  • 该文件包含一个平台 id = 1 和编码 id = 0 的 cmap 表。该表将代码 01 映射到字形索引 01,即页面上显示的“dz”符号。
  • @iPDFdev:是吗?我已按照接受的答案中的建议使用 OT Master Light 来确认存在 (1,0) cmap 子表,但其 GID 条目均为零,我怀疑这与评论“@987654324”有关@" 在 LibreOffice 源代码中。此外,“dz”符号位于字形索引 3。我怀疑 LibreOffice 正在生成损坏的 PDF,从而触发查看器中特定于实现的行为。

标签: pdf fonts truetype


【解决方案1】:

使用 OT Master Light 可以看出,cmap 1:0 将字符代码 0x01 映射到字形索引 1(第一个图像,列表中的第二个条目),即“dz”符号(第二个图像)。

【讨论】:

  • 我得到了不同的结果...你是否也使用 fontforge 来提取你的 f1.ttf 文件?
  • @jl6 我们使用了我们的内部工具。您也可以使用它从 PDF 文件中提取字体数据:xfiniumpdf.com/xfinium-pdf-inspector/…
【解决方案2】:

如何检查 TrueType 字体的 cmap 表和子表?

OT Master Light,来自 Dutch Type Library,是一个免费工具,对于检查内部字体表非常方便。

【讨论】:

    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2011-07-15
    • 2019-12-10
    • 2010-10-11
    • 2019-10-02
    • 2019-12-19
    相关资源
    最近更新 更多