6

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

嵌入字体从它们的 FontFile 流中解压缩并使用AddFontMemResourceEx. 现在一些嵌入字体删除了 GDI 需要的一些 TrueType 表,例如“名称”表。因此,我尝试通过将 TrueType 子集字体解析到其表中来修改字体,并使用尽可能正确的信息重新生成数据缺失/缺失表的那些表。

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

问题:

  1. 如何确定我需要更改字体文件以使 GDI 能够使用它?
  2. 是否有任何其他字体验证工具可以让我深入了解字体文件仍然存在什么问题?

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

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

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

2 回答 2

4

迟了将近一年,但我找到了答案:

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

看起来“符号 cmap”的存在决定了该字体是否被 Windows 视为符号字体;'OS/2' 中的标志似乎无关紧要。

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

于 2011-06-15T19:50:04.653 回答
3

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

GDI 的一种选择可能是尝试使用TTLoadEmbeddedFont自己将嵌入的字体加载到文档/表单中,然后检查从错误消息返回的任何错误。提供比这更多信息的唯一功能是CreateFontPackage / MergeFontPackage,以及它们的错误代码,但我确实看不到它们如何在您的情况下使用。

除此之外,您是否有机会查看 PDFCreator 的源代码(假设您使用的是开源代码而不是商业代码)?

于 2010-06-18T02:35:46.327 回答