fontTools.subsetでウェブフォント
fontTools.subsetでウェブフォントfontTools.subset
fontTools.subsetpyftsubsetコマンドもありますが、スクリプトを書きました。
from fontTools.subset import Options, load_font, Subsetter, save_font
subset_options = Options(**_subset_options)
font = load_font("path/to/font_file", subset_options)
subsetter = Subsetter(subset_options)
subsetter.subset(font)
save_font(font, "path/to/outfile", subset_options)
Options
OptionsSubsetter.populateを使っています。
subset_options = Options(
flavor="woff2",
with_zopfli=True,
layout_features=["*"],
hinting=False,
drop_tables=[],
name_IDs=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],
)
flavor、with_zopfli
flavor、with_zopfliflavorを指定しなければ、単にサブセット化します。いわゆるウェブフォント形式(WOFF、WOFF2)には変換されません。
layout_features
layout_featureshinting
hintingdrop_tables
drop_tablesname_IDs
name_IDsload_font
load_fontfontTools.ttLib.ttFont.TTFontオブジェクトとして扱われます。
Subsetter
SubsetterfontTools.ttLib.ttFont.TTFont.getBestCmapなどですべてのグリフを取得しておいて、分割しています。
subsetter = Subsetter(subset_options)
codepoints = []
for codepoint in font.getBestCmap().keys():
codepoints.append(codepoint)
from copy import deepcopy
n = 47
while 0 < len(codepoints):
subset_unicode = codepoints[0:n]
codepoints[0:n] = []
subsetter_copy = deepcopy(subsetter)
subsetter_copy.populate(unicode=subset_unicode)
font_copy = deepcopy(font)
subsetter_copy.subset(font_copy)
populate
populatesubset
subsetsave_font
save_fontunicode-range
unicode-range/* ASCIIが使われるときにだけ読み込まれるフォント */
@font-face {
font-family: "My Font";
font-weight: 100 900;
src: url(MyFont.1.woff2) format("woff2");
unicode-range: U+20-7f;
}
/* unicode-range未指定と大差ないフォント */
@font-face {
font-family: "My Font";
font-weight: 100 900;
src: url(MyFont.2.woff2) format("woff2");
unicode-range: U+0-1f0000;
}