更改嵌入的TrueType字体,以便Windows GDI可以使用它

Rit*_*tra 6 pdf gdi truetype embedded-fonts

我试图将PDF内容呈现给GDI设备上下文(确切地说是24位位图).将PDF流解析为PDF对象并从内容字典中呈现PDF命令效果很好,包括字体渲染.

嵌入式字体从其FontFile流中解压缩并使用"加载" AddFontMemResourceEx.现在一些嵌入字体删除了GDI所需的一些TrueType表,比如'name'表.因此,我尝试通过将TrueType子集字体解析为其表来修改字体,并修改那些具有数据缺失/缺失表的表,并使用尽可能正确的信息重新生成.

我使用Microsoft字体验证工具来查看生成的字体是如何"正确"的.我仍然得到一些错误,比如对于maxp表,最大值通常太大(它是一个子集)或者xAvgCharWidth字段不等于'OS/2'表的计算值不正确但这不会停止其他嵌入字体可用.使用PDFCreator嵌入的字体是有问题的.

问题:

  1. 如何确定我需要更改为字体文件以便GDI能够使用它?
  2. 是否还有其他字体验证工具可以让我深入了解fontfile的错误?

如果需要:我可以在某处制作原始字体文件和更改后的字体文件.

到目前为止做了哪些修改:

  • 确保有'head','hhea','maxp'和'OS/2'部分.
  • 如果我们有符号字体,请清除'OS/2'部分中的Panose和Unicode字段
  • 如果我们为零,请填写WInAscent/Desc和TypoAsc/Desc的正确值.
  • 为超级/下标/下划线位置和大小填写可接受的值.
  • 扫描剩下的所有字形,在头部填写X/Y最小值/最大值.
  • 使用来自的PDF文件中的信息重建名称部分.

Rit*_*tra 4

差不多晚了一年,但我找到了答案:

“cmap”表和“name”表的字体类型(符号或非符号)应该相同。因此,如果 cmap 具有 3,0,4 cmap(MS、符号、段增量编码)并且名称表包含 3,1,$0409(MS、Unicode、enUS)条目,则该字体将不会加载。

看起来“symbol cmap”的存在决定了 Windows 是否将字体视为符号字体;“OS/2”中的标志似乎并不重要。

因此,如果使用“Microsoft Font Validator”看起来字体正确,请检查“cmap”和“name”表中的符号/unicode 字段是否对齐。