1

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

4

2 回答 2

8

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选项,但总的来说这个方案应该有效。可能需要注意的是,如果您的程序的其他部分使用/依赖sys.argv; 如果是这种情况,您可能希望在修改和调用 subsetter 之前捕获另一个变量中的初始值sys.argv,然后在之后将其重新设置为初始值。

于 2019-03-07T00:22:53.913 回答
2

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

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

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

我在这个讨论中找到了线索。

于 2021-03-12T19:33:10.723 回答