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