代码之家  ›  专栏  ›  技术社区  ›  Ritsaert Hornstra

修改嵌入的TrueType字体,以便Windows GDI使用

  •  6
  • Ritsaert Hornstra  · 技术社区  · 16 年前

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

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

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

    问题:

    1. 我如何确定我需要什么 更改为字体文件以便 GDI能用它吗?
    2. 有其他字体验证吗 可以让我洞察的工具 进了什么问题 FUNTFILE?

    如果需要:我可以在某个地方下载原始的字体文件和修改过的字体文件。

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

    • 确保有“head”、“hhea”、“maxp”和“os/2”部分。
    • 如果我们有符号字体,请清除“OS/2”部分中的panose和unicode字段。
    • 如果值为零,请为winascent/desc和typoasc/desc填写正确的值。
    • 填写超/下标/下划线位置和尺寸的可接受值。
    • 扫描在头中填充X/Y最小/最大值时留下的所有标志符号。
    • 使用来自PDF文件的信息重新生成“名称”部分。
    2 回复  |  直到 14 年前
        1
  •  3
  •   Todd Main    16 年前

    AddMemoryFont 在GDI+中,您可以检查 Status 对于内存字体中的任何错误,例如 NotTrueTypeFont 例如。

    gdi的一个选择可能是尝试将嵌入的字体加载到文档/表单中 TTLoadEmbeddedFont 然后检查从 error messages . 唯一能提供更多信息的功能是 CreateFontPackage / MergeFontPackage 和他们的 error codes 但我不知道如何在你的情况下使用它们。

    除此之外,你有没有机会回顾一下PDF创建者的 source code (假设您使用的是开源版本,而不是商业版本)?

        2
  •  3
  •   Ritsaert Hornstra    15 年前

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

    “cmap”表和“name”表的字体类型(符号与否)应相同。因此,如果cmap有一个3,0,4 cmap(ms,symbol,segment delta coding),并且名称表包含3,1,$0409(ms,unicode,enus)条目,则不会加载字体。

    “symbol cmap”的存在似乎决定了Windows是否将该字体视为符号字体;“os/2”中的标志似乎无关紧要。

    因此,如果使用“Microsoft字体验证程序”时字体似乎正确,请检查“cmap”和“name”表中的symbol/unicode字段是否对齐。

    推荐文章