You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 03:52:46