我正在尝试将 PDF 内容呈现到 GDI 设备上下文(准确地说是 24 位位图)。将 PDF 流解析为 PDF 对象并从内容字典渲染 PDF 命令效果很好,包括字体渲染。
嵌入字体从它们的 FontFile 流中解压缩并使用AddFontMemResourceEx
. 现在一些嵌入字体删除了 GDI 需要的一些 TrueType 表,例如“名称”表。因此,我尝试通过将 TrueType 子集字体解析到其表中来修改字体,并使用尽可能正确的信息重新生成数据缺失/缺失表的那些表。
我使用Microsoft Font Validator工具来查看生成的字体有多“正确”。我仍然遇到一些错误,例如 maxp 表的最大值通常太大(它是一个子集)或xAvgCharWidth
字段不等于“OS/2”表的计算值不正确,但这不会停止其他嵌入字体可用。使用 PDFCreator 嵌入的字体是有问题的。
问题:
- 如何确定我需要更改字体文件以使 GDI 能够使用它?
- 是否有任何其他字体验证工具可以让我深入了解字体文件仍然存在什么问题?
如果需要:我可以制作原始字体文件和更改后的字体文件以供在某处下载。
到目前为止做了哪些修改:
- 确保有“head”、“hhea”、“maxp”和“OS/2”部分。
- 如果我们有符号字体,请清除“OS/2”部分中的 Panose 和 Unicode 字段
- 如果我们为零,则为 WInAscent/Desc 和 TypoAsc/Desc 填写正确的值。
- 填写上标/下标/下划线位置和大小的可接受值。
- 扫描所有留下的字形并在头部填充 X/Y 最小值/最大值。
- 使用来自它的 PDF 文件中的信息重建名称部分。