如何以编程方式确定字体是不是为 CFF?

Posted

技术标签:

【中文标题】如何以编程方式确定字体是不是为 CFF?【英文标题】:How to programmatically determine whether a font is CFF?如何以编程方式确定字体是否为 CFF? 【发布时间】:2016-09-16 19:34:06 【问题描述】:

好吧,我承诺这是我最接近“我的代码”的问题:) 如果这没有引起任何回应,我会咬紧牙关建立用于检查 CFF 表是否存在的 OTF 解析器。

此信息可在 Windows 字体预览中找到(“TrueType 轮廓”与“PostScript 轮廓”),所以大概有一个 WinAPI 函数可以实现此效果,但如果我能找到它,该死的。

有人想吗?

ps - 如果只能检查已安装的字体,这不是什么大问题,但最好检查文件。

【问题讨论】:

问题不应该包含“解决方案”,所以我回滚到你原来的问题。如果您觉得您的编辑添加了现有答案中未提及的内容,您可以随意add an answer of your own!如果您愿意:您的问题的先前版本仍可在其编辑历史记录中找到。 【参考方案1】:

您最好的选择确实似乎是直接从字体文件本身读取字体表。假设您已经熟悉字体表,此示例here 将提供一个良好的开端。如果没有,请阅读文章底部参考部分中的链接。

【讨论】:

【参考方案2】:

您可以使用GetFontData 函数来做到这一点。

创建有问题的字体并选择到DC中,然后调用GetFontData查询CFF table的大小。这只有在字体有 PostScript 轮廓时才会成功。

DWORD dwSize = GetFontData(hdc, ' FFC', 0, nullptr, 0);
if (dwSize && dwSize != GDI_ERROR)

    // has PostScript outlines

【讨论】:

【参考方案3】:

OpenType spec 说:

包含 CFF 数据的 OpenType 字体应使用标记“OTTO”作为 sfnt 版本号。

因此,如果文件的前四个字节拼写为“OTTO”,则它使用 PostScript 轮廓。能不能简单点!?到目前为止已经过测试和工作,但我最终可能会使用 GetFontData。

【讨论】:

【参考方案4】:

具有 CFF 块的 OpenType 文件的前 4 个字节是“OTTO”。

【讨论】:

以上是关于如何以编程方式确定字体是不是为 CFF?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将CFF字体转换为OpenType字体

有没有办法以编程方式确定字体文件是不是具有特定的 Unicode 字形?

如何以编程方式确定用户是不是从 iOS 中的 Adwords 转换而来,或者是不是可以将此数据转换为用户属性?

如何以编程方式将字体自定义字体设置为 Spinner 文本?

如何以编程方式将控制台字体设置为 Lucida?

如何以编程方式确定 Windows 任务栏是不是隐藏?