跳转到主要内容

fontTools 入门:查看、修改、转格式

适合谁看:想用命令行查看字体信息、做子集、转 WOFF2 的开发者和技术型设计师。不需要会写程序,照着命令改文件名就能用。

fontTools 是什么

fontTools 是一个用 Python 编写的开源字体工具库(MIT 许可),由 fonttools 社区维护。社区维护[1][2]。很多字体工具(包括 fontmake、Font Bakery)都建立在它之上。装好后会得到一组命令:

  • ttx:把字体转成可读的 XML 文本,也能转回来;也能转回来[3];
  • pyftsubset(即 fonttools subset):做子集、优化文件大小;优化文件大小[4];
  • fonttools ttLib.woff2:压缩和解压 WOFF2;WOFF2[5];
  • 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)逐条读》 和《自托管网页字体的许可要点》。

参考资料

参考资料(6)
    1. fontTools 文档:https://fonttools.readthedocs.io/en/latest/文档(英文),fontTools 项目
    2. ttxfontTools 说明:https://fonttools.readthedocs.io/en/latest/ttx.html源代码仓库,GitHub:fonttools
    3. subsetttx 说明:https://fonttools.readthedocs.io/en/latest/subset/index.html说明,fontTools 项目
    4. instancerfontTools 说明:https://fonttools.readthedocs.io/en/latest/varLib/instancer.htmlsubset 模块文档(英文),fontTools 项目
    5. ttLib 说明:https://fonttools.readthedocs.io/en/latest/ttLib/index.html说明,fontTools 项目
    6. instancer 说明,fontTools 源代码:https://github.com/fonttools/fonttools项目