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

时间:2019-03-05 19:15:51

标签: python fonts ttx-fonttools

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

2 个答案:

答案 0 :(得分:2)

'data': np.ones(3,)本身就是一个Python脚本,该脚本调用pyftsubset,后者依次解析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并调用子集之前,先在另一个变量中捕获初始值,然后再将其重置为初始值。

答案 1 :(得分:2)

我认为这应该是一种正确的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 中找到了线索。