从三份TTF到一份多语言字体:FontTools字体合并实战手册 从三份TTF到一份多语言字体FontTools字体合并实战手册【免费下载链接】fonttoolsA library to manipulate font files from Python.项目地址: https://gitcode.com/gh_mirrors/fo/fonttools手里有三份静态字体latin.ttf 管拉丁文、arabic.ttf 管阿拉伯文、hebrew.ttf 管希伯来文而排版端只想要一个包含全部三种文字的字库文件。FontTools 的字体合并能力就是为这类需求准备的它是 Python 生态里操作字体文件的库内置的 merge 模块能把多个字体的轮廓、字符映射和 OpenType 布局表揉进同一个文件名字冲突、度量不一致这些脏活由它出面处理。合并模块替你干掉的四件事如果只是把字形表简单拼起来得到的并不是一个能用的字体。fontTools.merge 模块 的合并逻辑实际覆盖四块字形命名空间每份字体各有一套字形名合并后必须共用一份统一的超级字形顺序——先出现的名字保留后到的重名者自动追加 .1、.2 之类的后缀。字符到字形的映射同一 Unicode 码位若被两份字体映射到不同字形默认取顺序靠前的字体另一个记为冲突对留给布局表处理。布局表GSUB/GPOS 的查找表lookup做拼接同名特性合并原有连字、定位规则不因合并而失效。跨字体度量hhea.ascent 这类字段取所有输入字体中的最大值避免合并后换行裁切。三步跑出一份合并字体第1步装工具。pip 装上 fonttools 后命令行里就有 fonttools 入口。第2步执行合并fonttools merge latin.ttf arabic.ttf hebrew.ttf --output-filemerged.ttf这条命令按顺序读入三份字体合并后写出 merged.ttf不加 --output-file 时默认也叫这个名。第3步验结果。把 merged.ttf 用 fonttools ttx 导出成 XML或用 ttLib 加载后打印字形数哪份源字体有问题会在这一步暴露。字体多到命令行放不下时把路径写进文本文件、一行一个、# 开头算注释再用 --input-file 传入fonttools merge --input-filefonts.txt --output-filemerged.ttf这样几十个字体源也不用在命令行里逐个敲出来。更偏向脚本化的用法可以直接调 Python 接口from fontTools.merge import Merger merger Merger() font merger.merge([latin.ttf, arabic.ttf]) font.save(merged.ttf)merger.merge 返回的是内存中的 TTFont 对象save 之后才落盘。重名字形怎么解决超级顺序与 locl 替换字体合并最有意思的部分是处理同一个码位、两份字体给了不同字形这种情况。merge/cmap.py 里的逻辑大致分三层建超级字形顺序后入字体的重名者被加上数字后缀两个字形得以共存于同一个命名空间。建超级 cmap同一码位默认映射靠前的字形靠后字体的不同字形被登记为按字体区分的冲突对。写 GSUB 的 locl 特性locl 是按语言区域替换字形的特性。举个典型例子阿拉伯字体和拉丁字体各有各的括号拉丁那份会被改名成 parenleft.1再在 latn 语言系统下插入 parenleft → parenleft.1 的替换排拉丁文时显示拉丁括号排阿拉伯文时用另一套。所以合并出来的字体不只是字形更多布局层仍知道每种语言该用哪一套字形。⚠️ 这条消歧路径的前提是字体带 GSUB 表否则会在合并时直接报错。边界条件、组合参数与常见坑合并前的三项预检所有输入字体的 units per em设计单位总数必须一致否则先统一缩放。存在重复字形消歧时字体必须含 GSUB 表。CID 键控的 CFF 目前不支持合并。变量字体母版另有工具要合并的是变量字体的母版时常规路径是用 varLib.merger 沿轴把各母版的差异合并成一份变量字体这和静态字体合并是两条不同的技术路线。母版、轴与实例在坐标系里的位置关系可以参考下图命令行参数组合--drop-tablestags逗号分隔的表标签大小写敏感合并前直接丢弃适合剔除互不兼容的元数据表。--import-filex.ttx合并后再导入一份 TTX 覆盖字段常用于改写 name 表的字体名与版权信息。--verbose、--timing输出每张表的合并进度和耗时排查卡在哪份字体时很管用。✅ 收尾时至少核对三处字形总数、抽几个码位看映射、OS/2 的平均字宽——合并后 xAvgCharWidth 会被自动重算但输出值仍值得肉眼确认一遍。小结fontTools 做字体合并的价值在于把两份字体装进一个文件当成一个完整工程问题命名空间、映射、布局、度量各自有明确的合并策略最常见的冲突场景同码位不同字形有 locl 兜底。静态字体掌握文中的两条命令即可上手涉及变量母版时再转向 varLib.merger 那条路径。【免费下载链接】fonttoolsA library to manipulate font files from Python.项目地址: https://gitcode.com/gh_mirrors/fo/fonttools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考