Как использовать 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)
Другие вопросы по тегам