python – 通过应用transform – reduce size来简化SVG

前端之家收集整理的这篇文章主要介绍了python – 通过应用transform – reduce size来简化SVG前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我经常有一些像这样的结构的SVG:

@H_404_5@

我想直接将translate应用于坐标并删除tranform-attribute:

@H_404_5@

你知道一个简化SVG的脚本/程序吗?还是用于解析SVG的python-snipplet?

这个脚本适用于我的特殊情况,但我想要一个总是有效的:

@H_404_5@#http://epydoc.sourceforge.net/stdlib/xml.dom.minidom.Element-class.html from xml.dom.minidom import parse,parseString import re f = open('/home/moose/mathe/svg/Solitaire-Board.svg','r') xmldoc = parse(f) p = re.compile('translate\(([-\d.]+),([-\d.]+)\)',re.IGNORECASE) for node in xmldoc.getElementsByTagName('svg:g'): transform_dict = node.attributes["transform"] m = p.match(transform_dict.value) if m: x = float(m.group(1)) y = float(m.group(2)) child_rectangles = node.getElementsByTagName('svg:rect') for rectangle in child_rectangles: x_dict = rectangle.attributes["x"] y_dict = rectangle.attributes["y"] new_x = float(x_dict.value) + x new_y = float(y_dict.value) + y rectangle.setAttribute('x',str(new_x)) rectangle.setAttribute('y',str(new_y)) node.removeAttribute('transform') print xmldoc.toxml()

我认为如果可以删除transform属性,svg的大小可以大大减少而不会降低质量.
如果该工具能够降低坐标精度,那么明智地删除不必要的区域,组和样式就会很棒.

最佳答案
我建议使用lxml.它非常快,并且有很多不错的功能.如果正确声明了svg名称空间前缀,则可以解析示例.你可以很容易地做到这一点:

@H_404_5@>>> svg = '

现在您可以使用lxml.etree(或xml.etree.ElementTree)解析它:

@H_404_5@>>> doc = etree.fromstring(svg)

如果你使用lxml,你可以利用XPath:

@H_404_5@>>> ns = {'svg': 'http://www.w3.org/2000/svg'} >>> doc.xpath('//svg:g/@transform',namespaces=ns) <<< ['translate(-251.5,36.5)']

猜你在找的Python相关文章