嵌入字体

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

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

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

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

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

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

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

如果为嵌入的字体设置了只读位,应用程序必须先加密字体数据,然后再将其与文档一起存储。 加密方法不需要复杂:例如,使用 XOR 运算符将字体数据与应用程序定义的常量组合在一起是足够快速的。