一个用于分析和优化 TTF 字体文件的命令行工具,通过智能去重减小字体文件总体积。
- 🔍 字体分析: 分析多个字体文件中的 glyph 重复情况
- 🎯 优先级去重: 根据用户指定的优先级保留 glyph
- 🎨 字形检测: 智能识别相同 Unicode 码点的字形变体(如 CJK 字符的地区差异)
- 📊 Unicode 范围过滤: 支持指定特定 Unicode 范围进行去重
- 🛡️ 排除范围保护: 保护特定范围的 glyph 不被去重
- ✅ 自动验证: 验证生成的字体文件有效性
- 🇨🇳 中文界面: 输出报告和错误信息使用中文
pip install -e .开发模式安装(包含测试依赖):
pip install -e ".[dev]"仅分析字体文件中的重复 glyph,不修改任何文件:
font-dedup analyze font1.ttf font2.ttf font3.ttf启用字形检测分析(识别字形变体):
font-dedup analyze NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf --shape-analysis限制字形分析的字符数量(加快分析速度):
font-dedup analyze font1.ttf font2.ttf --shape-analysis --codepoint-limit 100基本去重操作:
font-dedup deduplicate font1.ttf font2.ttf -o ./output指定字体优先级(font1.ttf 优先级最高):
font-dedup deduplicate font1.ttf font2.ttf -o ./output -p font1.ttf仅处理中文字符范围:
font-dedup deduplicate font1.ttf font2.ttf -o ./output -r 0x4E00-0x9FFF排除 ASCII 字符范围:
font-dedup deduplicate font1.ttf font2.ttf -o ./output -e 0x0020-0x007F自定义输出文件后缀:
font-dedup deduplicate font1.ttf font2.ttf -o ./output -s _optimized启用字形检测去重(保护字形变体):
font-dedup deduplicate NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf -o ./output --shape-analysis自定义字形相似度阈值(默认 1.0,即完全相同):
font-dedup deduplicate font1.ttf font2.ttf -o ./output --shape-analysis --similarity-threshold 0.95- 解析字体: 使用 fonttools 解析 TTF 文件,提取 glyph 和 Unicode 映射信息
- 检测重复: 分析多个字体间的 code point 重叠情况
- 字形分析(可选): 提取字形轮廓数据,计算相似度,识别字形变体
- 优先级去重: 根据优先级顺序,从低优先级字体中移除重复 glyph
- 生成字体: 使用 fonttools subsetting 功能生成优化后的字体文件
- 验证输出: 验证生成的字体文件格式正确且所有保留的 glyph 可访问
字形检测功能专门用于处理 CJK(中日韩)字体等存在地区字形差异的场景。相同的 Unicode 码点在不同地区可能有不同的字形设计:
- 简体中文 (SC) vs 韩文 (KR): 许多汉字有不同的笔画风格
- 日文 (JP) vs 繁体中文 (TC): 部分汉字的写法存在差异
启用字形检测后,工具会:
- 提取每个字符的轮廓数据
- 计算字形相似度(默认使用严格相等检查)
- 识别字形变体并在所有字体中保留
- 仅去重真正相同的字形
性能说明: 字形分析需要提取和比较轮廓数据,对于包含数千字符的 CJK 字体可能需要较长时间。建议:
- 首次分析时使用
--codepoint-limit参数快速评估 - 使用
--range参数限制分析范围 - 对于生产环境,可以缓存分析结果
假设你有三个字体文件,想要去除重复的 glyph:
# 分析重复情况
font-dedup analyze NotoSans-Regular.ttf NotoSans-Light.ttf
# 执行去重(NotoSans-Regular.ttf 优先级更高)
font-dedup deduplicate NotoSans-Regular.ttf NotoSans-Light.ttf -o ./output -p NotoSans-Regular.ttf处理中日韩字体时,启用字形检测以保护地区字形差异:
# 分析字形变体
font-dedup analyze NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf --shape-analysis --codepoint-limit 50
# 执行字形检测去重
font-dedup deduplicate NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf -o ./output --shape-analysis只对 CJK 统一表意文字进行去重:
font-dedup deduplicate font1.ttf font2.ttf -o ./output -r 0x4E00-0x9FFF去重时保护 ASCII 字符不被删除:
font-dedup deduplicate font1.ttf font2.ttf -o ./output -e 0x0020-0x007F- Python 3.10+
- fonttools: 字体文件解析和处理(包括轮廓数据提取)
- click: 命令行接口
- pytest + hypothesis: 单元测试和属性测试框架
测试需要使用 TTF 字体文件。你可以从 Google Fonts 下载 Noto Sans 系列字体:
将下载的 TTF 文件放在项目根目录即可运行测试。
运行所有测试(不包括慢速 CJK 测试):
pytest -m "not cjk"运行所有测试(包括 CJK 字形检测测试):
pytest仅运行 CJK 字形检测测试:
pytest -m cjk运行测试并查看覆盖率:
pytest --cov=src/font_dedup注意: CJK 字形检测测试需要较长时间(1-2 分钟),因为需要分析大型字体文件的轮廓数据。
font-dedup/
├── src/font_dedup/
│ ├── analyzer.py # 字体分析器
│ ├── shape_analyzer.py # 字形分析器(轮廓提取和相似度计算)
│ ├── engine.py # 去重引擎(支持字形检测)
│ ├── generator.py # 字体生成器
│ ├── validator.py # 验证器
│ ├── reporter.py # 报告生成器(支持字形变体报告)
│ ├── models.py # 数据模型
│ ├── cli.py # 命令行接口
│ └── utils.py # 工具函数
├── tests/ # 测试文件
│ ├── test_cjk_fonts.py # CJK 字体测试(标记为慢速测试)
│ └── test_shape_detection_integration.py # 字形检测集成测试
├── .kiro/specs/ # 功能规格文档
└── pyproject.toml # 项目配置
本项目代码使用 MIT License。
测试使用的 Noto Sans 字体文件(位于 fonts/ 目录和项目根目录)使用 SIL Open Font License (OFL) 1.1。
- 版权所有: The Noto Project Authors
- 来源: https://fonts.google.com/noto
- 许可证详情: 请参阅
fonts/OFL.txt
这些字体文件仅用于测试目的,不包含在软件分发包中。
hellsge (hellsge@qq.com)