嵌入字体

嵌入字体是将文档捆绑到文件中以传输到另一台计算机的字体的技术。 嵌入字体可确保传输文件中指定的字体将出现在接收该文件的计算机上。 但是,并非所有字体都可以从计算机移动到计算机,因为大多数字体一次只获得一台计算机的许可。 只能嵌入 TrueType 和 OpenType 字体。

仅当用户请求时,应用程序才应在文档中嵌入字体。 应用程序不能与包含嵌入字体的文档一起分发,应用程序本身也不能包含嵌入的字体。 每当应用程序以任何格式分发字体时,都必须确认字体所有者的专有权利。

这可能是违反字体供应商的专有权利或用户许可协议,嵌入不允许嵌入的任何字体,或者未能遵守以下嵌入字体准则。 字体许可证只能授予在目标计算机上安装和使用字体的读/写权限。 或者许可证可以授予只读权限。 只读权限允许目标计算机查看和打印文档(但不修改);具有只读嵌入字体的文档本身是只读的。 只读嵌入字体可能不会从文档取消包,并且安装在目标计算机上。

应用程序可以通过调用 GetOutlineTextMetrics 函数并检查 OUTLINETEXTMETRIC 结构的 otmfsType 成员来确定许可证状态。 如果设置了 otmfsType 位 1,则不允许对字体进行嵌入。 如果位 1 清晰,可以嵌入字体。 如果设置了位 2,则嵌入是只读的。

若要嵌入 TrueType 字体,应用程序可以使用 GetFontData 函数读取字体文件。 将 dwTabledwOffset 参数 GetFontData 设置为 0L,将 cbData 参数设置为 1L 可确保应用程序从头读取整个字体文件。

多种功能可用于嵌入 OpenType 字体,具体取决于字符宽度和字体数据所在的位置。 若要嵌入驻留在设备上下文中的 OpenType Unicode 字体,应用程序可以使用 TTEmbedFont。 若要嵌入驻留在设备上下文中的 OpenType UCS-4 字体,应用程序可以使用 TTEmbedFontEx。 若要嵌入位于字体文件中的 OpenType Unicode 字体,应用程序可以使用 TTEmbedFontFromFile。 有关 OpenType 字体嵌入的其他信息,请参阅 字体嵌入参考

应用程序检索字体数据后,可以使用任何适用的格式将数据与文档一起存储。 大多数应用程序都会在文档中生成字体目录,列出嵌入的字体以及嵌入是读/写还是只读。 应用程序可以使用 otmpStyleNameotmFamilyNameOUTLINETEXTMETRIC 结构的成员来标识字体。

如果为嵌入字体设置了只读位,则应用程序必须在将字体数据与文档一起存储之前对其进行加密。 加密方法不需要复杂;例如,使用 XOR 运算符将字体数据与应用程序定义的常量合并足够且快速。