使用fontTools与PyMuPDF生成字体时曲线质量无法保留
修复字体转换中的曲线质量下降问题
以下是针对AI网格字形转字体工具中曲线质量丢失问题的具体排查和修复方案:
1. 阻止PyMuPDF简化路径提取
PyMuPDF默认会对提取的路径进行简化处理,这是导致曲线变形的核心原因之一。修改drawings_for_tile函数中的路径提取逻辑,添加PDFDRAW_NO_SIMPLIFY标志以保留原始曲线细节:
def drawings_for_tile(page, tile_rect): kept = [] # 添加NO_SIMPLIFY标志禁用路径自动简化 for d in page.get_drawings(flags=fitz.PDFDRAW_NO_SIMPLIFY): r = fitz.Rect(d["rect"]) if not r.intersects(tile_rect): continue # 过滤超出tile范围的大尺寸冗余路径 if r.width > tile_rect.width * 1.2 or r.height > tile_rect.height * 1.2: continue fill = d.get("fill") stroke = d.get("color") fo = d.get("fill_opacity", 1.0) so = d.get("stroke_opacity", 1.0) # 跳过不可见或仅作为裁剪路径的图形 if (fill is None or fo == 0) and (stroke is None or so == 0): continue kept.append(d) return kept
2. 禁用fontTools的自动优化
fontTools在保存字体时默认会对CFF字符进行优化,可能会合并曲线段或减少控制点,导致质量损失。修改保存字体的代码,关闭优化选项:
# 原保存代码 # font.save(OUTPUT_FONT) # 修改为: font.save(OUTPUT_FONT, optimize=False)
3. 确保AI导出PDF的质量设置
从Illustrator导出PDF时必须保证矢量数据完整性:
- 选择「高质量打印」预设
- 在「压缩」选项卡中,将「矢量图形」设置为「不压缩」
- 禁用「将渐变转换为网格」等可能破坏曲线结构的选项
- 保持导出分辨率与AI文件一致(默认72dpi即可,无需调整)
4. 验证坐标转换精度
检查坐标映射逻辑是否引入误差:
- 确保
TILE_SIZE与AI中实际的网格 tile 尺寸完全匹配(单位为PDF点,1英寸=72点) - 避免在路径绘制前对坐标进行不必要的舍入,保持浮点精度直到最终生成字符串
5. 调试路径提取结果
添加临时调试代码,对比原始AI路径和提取后的曲线段数量,确认没有丢失曲线:
def draw_drawing_to_pen(drawing, pen, tile_rect, flip_y=False, scale=1.0): # 添加曲线段计数器 curve_count = 0 items = drawing["items"] H = tile_rect.height cur = None start_pt = None contour_open = False # ... 原有代码 ... for it in items: op = it[0] if op in ("c", "v", "y"): curve_count +=1 # ... 原有代码处理逻辑 ... print(f"当前图形提取到{curve_count}条曲线段")
通过以上步骤,可有效保留原始AI文件中的曲线细节,避免转换过程中的质量损失。
内容的提问来源于stack exchange,提问作者Nurul Alam Ador
相关产品推荐
相关产品推荐

