如何在 python 环境中使用 Fonttools 的 pyftsubset,而不是从命令行

How to use pyftsubset of Fonttools inside of the python environment, not from the command line

我需要对很多字体文件进行子集化,我需要在 python 环境中进行。然而,Fonttools 的文档非常少,我找不到模块和正确的函数语法来从 python 中基于 unicode 执行子集化,而不是作为命令行工具 (pyftsubset)。我的一些文件在被 Fonttools 读取时包含各种错误,我无法使用 jupyter 中的 !command 捕获异常。

pyftsubset 本身只是一个 Python 脚本,它调用 fontTools.subset.main,后者又解析 sys.argv(命令行参数)以执行子集化。您可以在自己的脚本中很容易地做同样的事情,例如:

import sys
from fontTools.subset import main as ss

sys.argv = [None, '/path/to/font/file.ttf', '--unicodes=U+0020-002F']
ss()  # this is what actually does the subsetting and writes the output file

显然,您需要为 --unicodes 加上许多其他 pyftsubset 选项使用自己的值,但一般来说,此方案应该可行。可能需要注意的是,如果您的程序的其他部分 use/rely 在 sys.argv 上;如果是这种情况,您可能希望在修改 sys.argv 和调用子集之前在另一个变量中捕获初始值,然后在之后将其重新设置为初始值。

我认为这应该是一种正确的 pythonic 方式:

from fontTools import subset
subsetter = subset.Subsetter()
subsetter.populate(unicodes=["U+0020", "U+0021"])
subsetter.subset(font)

虽然 font 是您的 TTFont,您可能需要查看文档以了解如何准确传递 unicode 列表。我没有测试这个确切的代码,但我用 subsetter.populate(glyphs=["a", "b"]) 测试了它,它做了类似的工作,但用 glyphNames 代替。 populate 方法可以采用记录的这些参数:populate(self, glyphs=[], gids=[], unicodes=[], text='')

我在 this discussion 中找到了线索。