Как использовать pyftsubset из Fonttools внутри среды python, а не из командной строки
Мне нужно поместить очень много файлов шрифтов, и мне нужно сделать это из среды Python. Тем не менее, Fonttools очень плохо документирован, и я не могу найти модуль и правильный синтаксис функции для выполнения поднабора на основе Unicode из Python, а не как инструмент командной строки (pyftsubset
). Некоторые из моих файлов содержат различные ошибки при чтении Fonttools, и я не могу перехватить исключения, используя !command
внутри Юпитера.
3 ответа
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
; если это так, вы можете захватить начальные значения в другой переменной перед изменением sys.argv
и вызов подмножества, а затем сбросьте его на начальные значения после.
Я думаю, что это должен быть питонический способ сделать это правильно:
from fontTools import subset
subsetter = subset.Subsetter()
subsetter.populate(unicodes=["U+0020", "U+0021"])
subsetter.subset(font)
Пока
font
это ваш TTFont, и вам может потребоваться проверить документацию, чтобы узнать, как именно передать список юникодов. Я не тестировал этот точный код, но я тестировал его с помощью
subsetter.populate(glyphs=["a", "b"])
который выполняет аналогичную работу, но вместо этого использует glyphNames. В
populate
может принимать эти аргументы, как описано в документации:
populate(self, glyphs=[], gids=[], unicodes=[], text='')
Я нашел ключ к этому в этом обсуждении.
В 2023 году правильный способ вызова подмножества Fonttools из Python — использовать стандартный интерфейс, аналогичный командной строке:
from fontTools import subset
args = [
"font.woff2",
"--unicodes=5f-7a,30-39,e8a6,e1b1,e5cf,e15b,e5c4,e8fd",
"--no-layout-closure",
"--output-file=./out.woff2",
"--flavor=woff2",
]
subset.main(args)