我正在尝试将PDF内容呈现给GDI设备上下文(确切地说是24位位图)。将PDF流解析为PDF对象并从内容字典中呈现PDF命令效果很好,包括字体渲染。
嵌入字体从其FontFile流中解压缩,并使用AddFontMemResourceEx
“加载”。现在一些嵌入字体删除了GDI所需的一些TrueType表,比如'name'表。因此,我尝试通过将TrueType子集字体解析为其表来修改字体,并修改那些具有数据缺失/缺失表的表,并使用尽可能正确的信息重新生成。
我使用Microsoft Font Validator工具查看生成的字体是如何“正确”的。我仍然得到一些错误,比如maxp表,最大值通常太大(它是一个子集)或xAvgCharWidth
字段不等于'OS / 2'表的计算值不正确但这并不能阻止其他嵌入字体可用。使用PDFCreator嵌入的字体是有问题的。
问题:
如果需要:我可以在某处制作原始字体文件和更改后的字体文件。
到目前为止做了哪些修改:
答案 0 :(得分:3)
使用GDI +中的AddMemoryFont,您可以检查内存字体中的任何错误Status,例如NotTrueTypeFont
。
GDI的一个选项可能是尝试使用TTLoadEmbeddedFont自行将嵌入字体加载到文档/表单中,然后检查从error messages返回的任何错误。提供比此更多信息的唯一功能是CreateFontPackage / MergeFontPackage和error 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'表中排列。