使用SVGWRITE在Python中为SVG元素加链接遇报错求助
这个报错的核心原因很可能是你使用了SVG Tiny profile(svgwrite默认就是这个),而SVG Tiny规范里不允许基本图形元素(比如line、rect、ellipse)直接作为元素的子元素——你必须把这些图形放到
方案1:切换到Full SVG Profile
在创建Drawing对象时,指定profile='full',这样svgwrite就会使用完整的SVG规范验证,允许基本图形直接作为的子元素:
import svgwrite # 指定profile为full,替代默认的tiny dwg = svgwrite.Drawing('test.svg', profile='full') # 创建超链接容器 link = dwg.add(dwg.a(href='#some-target')) # 直接添加line元素,不再触发验证错误 link.add(dwg.line(start=(10, 10), end=(100, 100), stroke='black')) # 添加上锚点目标(示例) dwg.add(dwg.circle(center=(100, 200), r=5, id='some-target')) dwg.save()
方案2:用包裹图形元素(兼容Tiny Profile)
如果你需要保持SVG Tiny兼容性,就把所有要加链接的图形放到
import svgwrite dwg = svgwrite.Drawing('test.svg', profile='tiny') link = dwg.add(dwg.a(href='#some-target')) # 创建组元素作为中间容器 group = link.add(dwg.g()) # 把line添加到组内 group.add(dwg.line(start=(10, 10), end=(100, 100), stroke='black')) # 也可以添加其他图形,比如矩形 group.add(dwg.rect(insert=(20, 20), size=(50, 50), fill='red', stroke='blue')) # 添加上锚点目标(示例) dwg.add(dwg.circle(center=(100, 200), r=5, id='some-target')) dwg.save()
错误原因说明
svgwrite在默认的Tiny profile下会严格遵循SVG Tiny 1.2的规则,其中<a>元素的直接子元素仅允许<text>、<g>、<switch>、<a>这类容器或文本类元素,不支持line、rect这类基础形状直接嵌套。而Full SVG 1.1规范则放开了这个限制,允许基础图形直接作为<a>的子元素,所以切换profile就能解决验证报错的问题。
内容的提问来源于stack exchange,提问作者cforster
相关产品推荐
相关产品推荐

