如何使用fontTools检测字体类型



是否有一种方法可以知道字体是TrueType还是OpenType字体?

我指定字体的扩展对我来说无关紧要,所以ttx.guessFileType(fontPath)对我来说不是一个很好的解决方案。

OpenType vs TrueType?

首先,我们需要定义"opentype"是什么意思。和";TrueType"字体。OpenType字体格式主要是作为TrueType格式的超集开发的,现在大多数带有。otf和。ttf扩展名的字体实际上都是OpenType字体。

字体是OpenType格式吗?

由于OpenType是TrueType的超集,您可以像这样检查。otf或。ttf字体是否为OpenType:

if fontPath.endswith('.otf') or fontPath.endswith('.ttf'):
fontFormat = 'OpenType'

字形轮廓是TrueType(二次型)还是OpenType/CFF(三次型)?

文件扩展名。otf和。ttf理论上是可以互换的,所以避免依赖扩展名是正确的。但大多数时候,扩展名为。otf的OpenType字体包含用三次bezier绘制的字形轮廓,并存储在CFFCFF2表中,而扩展名为。ttf的OpenType字体包含用二次bezier绘制的字形轮廓,并存储在glyf表中。

因此,如果您不确定文件扩展名,您可以简单地检查字体是否包含glyf表。

from fontTools.ttLib.ttFont import TTFont
font = TTFont("font.ttf")
if 'glyf' in font:
outlineFormat = "TrueType"
elif 'CFF ' in font or 'CFF2' in font:
outlineFormat = "OpenType/CFF"
else:
outlineFormat = "Unknown/Invalid"

旁注:通常,如果字体包含TrueType轮廓,字体的前四个字节也将被编码为'x00x01x00x00',如果字体包含OpenType/CFF轮廓,前我们的字节将被编码为'OTTO'。在fontTools中,你可以通过TTFont.sfntVersion属性来检查。

可以查看文件签名:

#!/usr/bin/python3
o = open('font', 'rb')
magic = o.read(5)
if magic.startswith(b'OTTO'):
print('OpenType')
elif magic.startswith(b'x00x01x00x00x00'):
print('TrueType')
else:
print('other')

来源

最新更新