如何用Python将TTF字体中可打印ASCII字符的字形转为SVG路径
从TTF字体提取可打印ASCII字符的路径坐标
不用绕路转整个SVG文件,直接用Python的字体处理库就能高效提取每个字符的路径坐标,或者按需生成单个字形的SVG路径。下面是具体实现方案:
直接提取路径(推荐)
用fonttools库直接解析TTF字体的字形轮廓,生成SVG路径字符串,再按需转换成坐标列表:
- 安装依赖
pip install fonttools svgpathtools
- 示例代码
from fontTools.ttLib import TTFont from fontTools.pens.svgPathPen import SVGPathPen from svgpathtools import parse_path, CubicBezier, QuadraticBezier # 加载目标TTF字体 font = TTFont("your_font_file.ttf") glyph_set = font.getGlyphSet() # 覆盖所有可打印ASCII字符(ASCII 32-126) printable_chars = [chr(code) for code in range(32, 127)] char_path_coords = {} for char in printable_chars: # 获取字符对应的字形名称 try: glyph_name = font.getBestCmap()[ord(char)] except KeyError: # 字体不包含该字符时跳过 char_path_coords[char] = None continue glyph = glyph_set[glyph_name] # 生成SVG路径指令 pen = SVGPathPen(glyph_set) glyph.draw(pen) svg_path_str = pen.getCommands() # 解析SVG路径为坐标点列表(包含起点、终点、贝塞尔控制点) path = parse_path(svg_path_str) coords = [] for segment in path: # 添加起点和终点 coords.append((round(segment.start.real, 2), round(segment.start.imag, 2))) coords.append((round(segment.end.real, 2), round(segment.end.imag, 2))) # 添加贝塞尔曲线的控制点 if isinstance(segment, (CubicBezier, QuadraticBezier)): for ctrl in segment.control_points: coords.append((round(ctrl.real, 2), round(ctrl.imag, 2))) char_path_coords[char] = coords # 示例:输出字符'A'的路径坐标 print("字符'A'的路径坐标:", char_path_coords['A']) font.close()
生成单个字形的SVG文件
如果需要单独导出每个字符的SVG文件,可结合svgwrite实现:
- 安装额外依赖
pip install svgwrite
- 导出SVG的代码片段
import svgwrite # 以字符'B'为例 char = 'B' svg_path = pen.getCommands() # 复用上面生成的svg_path_str dwg = svgwrite.Drawing(f"glyph_{char}.svg", size=("100px", "100px"), profile='tiny') dwg.add(dwg.path(d=svg_path, fill='none', stroke='black', stroke_width=1)) dwg.save()
关键说明
fonttools是专业的字体处理库,能直接读取TTF的字形轮廓数据,比转整个SVG文件更高效- 若字体缺少某些可打印ASCII字符,代码会自动跳过并标记为
None - 坐标值默认保留两位小数,可根据需求调整精度
内容的提问来源于stack exchange,提问作者Vixey
相关产品推荐
相关产品推荐

