# fontTools 入门：查看、修改、转格式

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

## fontTools 是什么

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

- `ttx`：把字体转成可读的 XML 文本，也能转回来；
- `pyftsubset`（即 `fonttools subset`）：做子集、优化文件大小；
- `fonttools ttLib.woff2`：压缩和解压 WOFF2；
- `fonttools varLib.instancer`：从可变字体中固定或缩小某个轴的范围；
- 以及合并字体、比较两个字体差异等功能，运行 `fonttools help` 可以看到完整列表。

## 安装

```bash
pip install fonttools brotli
```

`brotli` 用于 WOFF2 压缩，只做查看可以不装。

## 常用操作

以下命令在 fontTools 4.66 上实测通过，文件名请换成你自己的。

**1. 看字体里有哪些表**

```bash
ttx -l MyFont.ttf
```

**2. 导出 name 表（字体名称、版权、许可等信息）**

```bash
ttx -t name MyFont.ttf
```

会生成 `MyFont.ttx`，用文本编辑器打开即可。name 表各编号的含义见[《看懂字体信息：名称、版本、字重和许可》](https://docs.cocobook.com/link/1276)。

**3. 整个字体转成 XML 再转回来**

```bash
ttx MyFont.ttf      # 生成 MyFont.ttx
ttx MyFont.ttx      # 转回字体；如果同名文件已存在，会生成 MyFont#1.ttf
```

适合检查或少量修改字体数据。

**4. 只保留一段文字用到的字（子集）**

```bash
pyftsubset MyFont.ttf --text-file=chars.txt --layout-features='*' --flavor=woff2 --output-file=MyFont-sub.woff2
```

`chars.txt` 里放要保留的文字；`--layout-features='*'` 保留全部排版功能（如标点挤压、竖排替换），中文字体建议加上。

**5. 转成 WOFF2 / 从 WOFF2 转回来**

```bash
fonttools ttLib.woff2 compress MyFont.ttf
fonttools ttLib.woff2 decompress MyFont.woff2 -o MyFont.ttf
```

**6. 从可变字体导出某个字重的静态字体**

```bash
fonttools varLib.instancer MyFont-VF.ttf wght=700 -o MyFont-Bold.ttf
```

也可以写成 `wght=300:700`，只保留这个范围内的字重（结果仍是可变字体，范围会受原字体的默认值限制）。

## 用 Python 读字体信息

```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()) # 有没有「啊」这个字
```

查某个字在不在字体里，详见[《怎么查一款字有没有某个字》](https://docs.cocobook.com/link/659)。fsType 的含义见[《字体文件里的「嵌入权限」》](https://docs.cocobook.com/link/1247)。

## 修改字体之前

用 fontTools 改字体名称、删减字符，属于「修改字体」。能不能改、改完能不能发布，要看许可证：

- OFL 字体允许修改，但如果原字体声明了保留字体名称，修改版不能用这个名称作为主要字体名；
- 商业字体一般不允许修改，即使只是做子集，也要看许可是否允许网页使用。

详见[《SIL 开放字体许可证（OFL）逐条读》](https://docs.cocobook.com/link/1244) 和[《自托管网页字体的许可要点》](https://docs.cocobook.com/link/1256)。

<p class="cb-refs-src" style="display:none;"><a href="https://docs.cocobook.com/link/1307#bkmrk-src-x05-fonttools">参考资料</a><span class="cb-refs-n">6</span><span class="cb-refs-t">fontTools 文档</span><span class="cb-refs-t">fontTools GitHub 仓库</span><span class="cb-refs-t">ttx: Convert fonts to XML and back</span></p>