Python使用minidom提取SVG路径后,svgwrite创建新SVG时<path>元素'd'属性无效值错误求助
解决SVG路径提取与重新生成的语法错误问题
你遇到的核心问题是错误地将SVG路径中的所有空格替换为逗号,这破坏了SVG路径的语法规则,导致svgwrite无法解析无效的路径字符串。
为什么替换空格会出错?
SVG路径的语法有明确规则:
- 路径命令(如
M、c、C)后面直接跟参数,不需要加逗号。比如M217.074,360.93c是合法的,但你替换后变成M217.074,360.93,c,这里c前的逗号会被解析器视为无效字符。 - 逗号仅用于分隔同一坐标对的x和y值(比如
217.074,360.93),而命令与参数、不同参数组之间用空格或逗号都可以,但不能在命令后加逗号。
修正后的解决方案
你完全不需要对提取到的路径字符串做任何空格替换操作,直接使用原始的d属性值即可。另外建议保留原SVG的viewBox属性,确保新SVG的显示位置和尺寸与原文件一致:
from xml.dom import minidom import svgwrite # 读取原SVG文件 doc = minidom.parse('Target_logo.svg') # 提取第一个路径及其属性 path_elements = doc.getElementsByTagName('path') if not path_elements: print("原SVG中未找到路径元素") else: first_path = path_elements[0] path_d = first_path.getAttribute('d') path_fill = first_path.getAttribute('fill') # 获取原SVG的viewBox(保证新SVG显示正确) svg_root = doc.getElementsByTagName('svg')[0] viewBox = svg_root.getAttribute('viewBox') # 创建新SVG并添加路径 new_svg = svgwrite.Drawing('test.svg', viewBox=viewBox) new_svg.add(new_svg.path(d=path_d, fill=path_fill)) new_svg.save() print("新SVG文件已成功生成")
额外说明
- 原代码中
display()函数是Jupyter Notebook特有的,如果在普通Python环境中运行,需要替换为print()。 - 若原SVG没有设置
viewBox,可以手动指定尺寸(比如size=("500px", "500px")),避免路径显示异常。
内容的提问来源于stack exchange,提问作者Hackerman
相关产品推荐
相关产品推荐

