如何使用 fontTools 检测 Type 1 和 OpenType CFF 字体

How to use fontTools to detect Type 1 and OpenType CFF fonts

我知道可以通过检查 'OTTO' (0x4F54544F) 的前 4 个字节来检测 Type 1 和 OpenType CFF(“PostScript 风格的 OpenType”)字体。

我如何在 Python 中使用 fontTools 库执行此操作?即,我需要检查哪种字体 table?

版本存储在字体文件头中,而不是字体数据中table。如果你有一个 ttLib.TTFont 对象(即你用 fontTools 打开了一个字体文件),你可以查看 TTFont 对象的 .sfntVersion 属性来获取版本(通常会可以是 0x00010000/Version 1 或 0x4F54544F/OTTO,但还有其他可能的值,见下文)。但是这种假设你已经通过打开一个字体文件创建了一个 TTFont 对象,所以这可能是先有鸡还是先有蛋的问题。如果您有兴趣在尝试打开 file/create a TTFont 之前了解版本,则必须(至少)嗅探 fontTools 之外的前四个字节。


注意:我对你的问题有点困惑。您提到 Type 1,它确实是一种 PostScript 字体,但(通常)不是 OpenType/sfnt-housed 字体中的那种(即 Type 2, "Compact Font Format", or CFF). There is supposedly a way to store Type 1 in OpenType/sfnt-housed fonts; Apple mentions this in their TrueType Reference manual:

The values 'true' (0x74727565) and 0x00010000 are recognized by OS X and iOS as referring to TrueType fonts. The value 'typ1' (0x74797031) is recognized as referring to the old style of PostScript font housed in a sfnt wrapper. The value 'OTTO' (0x4F54544F) indicates an OpenType font with PostScript outlines (that is, a 'CFF ' table instead of a 'glyf' table). Other values are not currently supported.

因此,如果 typ1 实际上是您要询问的内容,您可以在文件的前四个字节中查找 0x74797031/"typ1"。但是实际的 typ1 sfnt-housed 字体非常罕见——几乎不存在。绝大多数实际 Type 1 字体将在 .PFA/.PFB 文件(对于非 Mac 平台)或 "Printer Font" 文件(pre-OS X Mac),它将与包含位图的旧资源叉 "suitcase" 文件配对。 Type 1 字体文件将 %!PS-AdobeFont-1 作为文件的第一个字节。