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

时间:2010-06-14 10:10:07

标签: pdf gdi embedded-fonts true-type-fonts

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

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

我使用Microsoft Font Validator工具查看生成的字体是如何“正确”的。我仍然得到一些错误,比如maxp表,最大值通常太大(它是一个子集)或xAvgCharWidth字段不等于'OS / 2'表的计算值不正确但这并不能阻止其他嵌入字体可用。使用PDFCreator嵌入的字体是有问题的。

问题:

  1. 我如何确定我需要什么 按顺序更改为字体文件 GDI能够使用吗?
  2. 还有其他字体验证吗? 可能会给我洞察力的工具 进入仍然存在的问题 fontfile?
  3. 如果需要:我可以在某处制作原始字体文件和更改后的字体文件。

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

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

2 个答案:

答案 0 :(得分:3)

使用GDI +中的AddMemoryFont,您可以检查内存字体中的任何错误Status,例如NotTrueTypeFont

GDI的一个选项可能是尝试使用TTLoadEmbeddedFont自行将嵌入字体加载到文档/表单中,然后检查从error messages返回的任何错误。提供比此更多信息的唯一功能是CreateFontPackage / MergeFontPackageerror codes,但我确实无法看到它们如何在您的情况下使用。

除非这一切,您是否有机会查看PDFCreator的source code(假设您使用的是开源的,而不是商业的)?

答案 1 :(得分:3)

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

'cmap'表和'name'表的字体种类(符号与否)应该相同。因此,如果cmap具有3,0,4 cmap(MS,符号,段delta编码)并且名称表包含3,1,$ 0409(MS,Unicode,enUS)条目,则不会加载该字体。

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

因此,如果使用“Microsoft Font Validator”显示字体正确,请检查符号/ unicode字段是否在'cmap'和'name'表中排列。