fontTools 入门:查看、修改、转格式
适合谁看:想用命令行查看字体信息、做子集、转 WOFF2 的开发者和技术型设计师。不需要会写程序,照着命令改文件名就能用。
fontTools 是什么
fontTools 是一个用 Python 编写的开源字体工具库(MIT 许可),由 fonttools 社区维护[1][2]。社区维护。很多字体工具(包括 fontmake、Font Bakery)都建立在它之上。装好后会得到一组命令:
ttx:把字体转成可读的 XML 文本,也能转回来[3];也能转回来;pyftsubset(即fonttools subset):做子集、优化文件大小[4];优化文件大小;fonttools ttLib.woff2:压缩和解压WOFF2[5];WOFF2;fonttools varLib.instancer:从可变字体中固定或缩小某个轴的范围[6];从可变字体中固定或缩小某个轴的范围;- 以及合并字体、比较两个字体差异等功能,运行
fonttools help可以看到完整列表。
安装
pip install fonttools brotli
brotli 用于 WOFF2 压缩,只做查看可以不装。
常用操作
以下命令在 fontTools 4.66 上实测通过,文件名请换成你自己的。
1. 看字体里有哪些表
ttx -l MyFont.ttf
2. 导出 name 表(字体名称、版权、许可等信息)
ttx -t name MyFont.ttf
会生成 MyFont.ttx,用文本编辑器打开即可。name 表各编号的含义见《看懂字体信息:名称、版本、字重和许可》。
3. 整个字体转成 XML 再转回来
ttx MyFont.ttf # 生成 MyFont.ttx
ttx MyFont.ttx # 转回字体;如果同名文件已存在,会生成 MyFont#1.ttf
适合检查或少量修改字体数据。
4. 只保留一段文字用到的字(子集)
pyftsubset MyFont.ttf --text-file=chars.txt --layout-features='*' --flavor=woff2 --output-file=MyFont-sub.woff2
chars.txt 里放要保留的文字;--layout-features='*' 保留全部排版功能(如标点挤压、竖排替换),中文字体建议加上。
5. 转成 WOFF2 / 从 WOFF2 转回来
fonttools ttLib.woff2 compress MyFont.ttf
fonttools ttLib.woff2 decompress MyFont.woff2 -o MyFont.ttf
6. 从可变字体导出某个字重的静态字体
fonttools varLib.instancer MyFont-VF.ttf wght=700 -o MyFont-Bold.ttf
也可以写成 wght=300:700,只保留这个范围内的字重(结果仍是可变字体,范围会受原字体的默认值限制)。
用 Python 读字体信息
from fontTools.ttLib import TTFont
font = TTFont("MyFont.ttf")
print(font["name"].getDebugName(1)) # 字体族名
print(font["name"].getDebugName(5)) # 版本
print(font["OS/2"].usWeightClass) # 字重数值,如 400
print(font["OS/2"].fsType) # 嵌入许可标志
print(ord("啊") in font.getBestCmap()) # 有没有「啊」这个字
查某个字在不在字体里,详见《怎么查一款字有没有某个字》。fsType 的含义见《字体文件里的「嵌入权限」》。
修改字体之前
用 fontTools 改字体名称、删减字符,属于「修改字体」。能不能改、改完能不能发布,要看许可证:
- OFL 字体允许修改,但如果原字体声明了保留字体名称,修改版不能用这个名称作为主要字体名;
- 商业字体一般不允许修改,即使只是做子集,也要看许可是否允许网页使用。
详见《SIL 开放字体许可证(OFL)逐条读》 和《自托管网页字体的许可要点》。