如何获取字体 PostScript 名称?
How to get a font PostScript name?
我添加了在我的应用程序生成的 PDF 中嵌入 Truetype 字体的可能性,但是字体 "Sitka Text"(及其变体 "Sitka Banner" , "Sitka small" 等)和 "Meiryo" 不嵌入。
我相信这是因为我使用的是 LOGFONT 对象中的名称,对于这些字体我应该使用 PostScript 名称。
如何获取Postscript名称?
我得到了 'name' table with GetFontData 但结果 return 没有任何我可以使用的名字。
WINAPI 上是否有任何方法可以给我该名称?
编辑: 我只向我的用户显示具有嵌入权限的字体 "Editable" 和 "Installable" 我用方法 EnumFontFamiliesEx and it's CALLBACK 函数获得。
我还检查了 NEWTEXTMETRIC ntmFlags,它显示我所有的字体都是 NTM_TT_OPENTYPE。
Edit2: 不嵌入我的意思是 PDF readers 不显示我嵌入的字体(并且 Acrobat 不显示任何文本)
一个example的错误。
已解决
首先,我要感谢 Michael Mckeough 和 mkl,你们太棒了,帮了我很多,我检查了我的原始字体,它没有损坏,我也没有更改字体字节,但后来我终于注意到了如果你调用 GetFontData 到一个 (.ttc) 文件,它会裁剪 ttcf 部分,没有 PDF reader 将能够理解它是什么字体。
理想情况下,您会在字体的 "name" table 中找到它。它将是 nameId 0x0006,采用对您的平台有用的形式。名称 table 的格式是 TrueType 和 OpenType 规范的一部分。 (您可以在此处找到副本 Microsoft Typography OpenType spec Name)。 table 中的条目可能非常多,也可能很少。特别是,Postscript 名称可能会或可能不会出现在任何给定的字体中。您需要查看 table 中的 nameID 0x0006,以及您可以使用的形式(语言、平台、编码)。对于后记名称,您很可能希望它们是英文的,ASCII 编码的,适用于任何平台。
不过,不太可能是因为这个原因没有嵌入字体!一个更常见的原因是嵌入这种字体是不合法的。在 Microsoft Typography OpenType Spec OS/2 中,您将看到一个名为 fsType 的字段。该字段包含指示该字体在何种情况下被许可嵌入的标志。没有 Reputable 工具将嵌入或子集此字体,这些标志表明它未获得嵌入许可。
我看到 "Sitka Text" 是 MS Windows 10 字体,由 windows 免费分发。它似乎不太可能不会获得嵌入许可。有趣的是,我通常使用的快速 "looking at" 字体的工具(Font Validator,以前可以从 Microsoft Typography 获得,但现在似乎不再可用)告诉我 OS/2 记录无效。它指定了类型 5,规范说类型 4 是最新的。对嵌入请求的正确响应需要访问 fsType 字段,如果记录格式未知,它应该 "fail safe",并拒绝嵌入字体。
所以这是字体无法为您嵌入的最可能原因。
我添加了在我的应用程序生成的 PDF 中嵌入 Truetype 字体的可能性,但是字体 "Sitka Text"(及其变体 "Sitka Banner" , "Sitka small" 等)和 "Meiryo" 不嵌入。
我相信这是因为我使用的是 LOGFONT 对象中的名称,对于这些字体我应该使用 PostScript 名称。
如何获取Postscript名称?
我得到了 'name' table with GetFontData 但结果 return 没有任何我可以使用的名字。
WINAPI 上是否有任何方法可以给我该名称?
编辑: 我只向我的用户显示具有嵌入权限的字体 "Editable" 和 "Installable" 我用方法 EnumFontFamiliesEx and it's CALLBACK 函数获得。
我还检查了 NEWTEXTMETRIC ntmFlags,它显示我所有的字体都是 NTM_TT_OPENTYPE。
Edit2: 不嵌入我的意思是 PDF readers 不显示我嵌入的字体(并且 Acrobat 不显示任何文本)
一个example的错误。
已解决
首先,我要感谢 Michael Mckeough 和 mkl,你们太棒了,帮了我很多,我检查了我的原始字体,它没有损坏,我也没有更改字体字节,但后来我终于注意到了如果你调用 GetFontData 到一个 (.ttc) 文件,它会裁剪 ttcf 部分,没有 PDF reader 将能够理解它是什么字体。
理想情况下,您会在字体的 "name" table 中找到它。它将是 nameId 0x0006,采用对您的平台有用的形式。名称 table 的格式是 TrueType 和 OpenType 规范的一部分。 (您可以在此处找到副本 Microsoft Typography OpenType spec Name)。 table 中的条目可能非常多,也可能很少。特别是,Postscript 名称可能会或可能不会出现在任何给定的字体中。您需要查看 table 中的 nameID 0x0006,以及您可以使用的形式(语言、平台、编码)。对于后记名称,您很可能希望它们是英文的,ASCII 编码的,适用于任何平台。
不过,不太可能是因为这个原因没有嵌入字体!一个更常见的原因是嵌入这种字体是不合法的。在 Microsoft Typography OpenType Spec OS/2 中,您将看到一个名为 fsType 的字段。该字段包含指示该字体在何种情况下被许可嵌入的标志。没有 Reputable 工具将嵌入或子集此字体,这些标志表明它未获得嵌入许可。
我看到 "Sitka Text" 是 MS Windows 10 字体,由 windows 免费分发。它似乎不太可能不会获得嵌入许可。有趣的是,我通常使用的快速 "looking at" 字体的工具(Font Validator,以前可以从 Microsoft Typography 获得,但现在似乎不再可用)告诉我 OS/2 记录无效。它指定了类型 5,规范说类型 4 是最新的。对嵌入请求的正确响应需要访问 fsType 字段,如果记录格式未知,它应该 "fail safe",并拒绝嵌入字体。
所以这是字体无法为您嵌入的最可能原因。