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