@remeus 的回答启发了我,但我不想直接使用pyftsubset.exe fontTools.subset;我想使用该脚本,因为我可以轻松地向其中添加一些内容。
代码
import fontTools.subset
from pathlib import Path
import os
SOURCE_FILE = Path('YOUR.ttf') # ttf, otf, ...
OUT_FORMAT = 'woff' # otf, woff, woff2, ...
TEXT_FILE = Path('YOUR.txt')
def main():
output_file = Path('temp') / Path(SOURCE_FILE.stem + '.' + OUT_FORMAT)
output_file.parent.mkdir(parents=True, exist_ok=True)
args = [SOURCE_FILE,
f"--output-file={output_file}",
# f"--text=中英文 abcdefg",
f"--text-file={TEXT_FILE}", # 中英文 abcdefg
# "--unicodes=U+0020-007E",
f"--flavor={OUT_FORMAT}",
# https://github.com/fonttools/fonttools/blob/1df4f1e/Lib/fontTools/subset/__init__.py#L332-L337
"--verbose=true", # https://github.com/fonttools/fonttools/blob/1df4f1e/Lib/fontTools/subset/__init__.py#L3015
# "--xml=true",
"--timing=true",
]
fontTools.subset.main([str(_) for _ in args])
os.startfile(output_file.parent)
if __name__ == "__main__":
main()
解释
以下是指定所需子集的三种方法
--text
: 直接写
--text-file
: 将文本写入文件中(重复也没关系,代码会自动为你删除)(我推荐这种方式。)
例子:
我的.txt (utf-8)
0123456
abcdefg
ABCDEFG
中英文
--unicodes
: 使用 unicode 范围
如果您需要转换为 woff2,则必须先使用 pip install brotlicffi 安装brotli。
理由:
其他问题
下面是间接问题。不想看的可以直接跳过这一段。
这是我的经验,我想在浏览器上使用字体,但出现如下错误
OTS解析错误:网页字体大小超过30MB
我的字体大小
因此,如果我将格式更改为 Woff 或 Woff2 可能会解决问题。
不过,您可以再次使用 fontTools
TTFont(Path()).save(Path())
当您的文件很大时,它会花费太多时间。
包裹