通过应用transform - reduce size来简化SVG

时间:2011-05-15 19:01:23

标签: python svg

我经常会遇到一些像这样的结构的SVG:

<svg:g
  transform="translate(-251.5,36.5)"
  id="g12578"
  style="fill:#ffff00;fill-opacity:1">
  <svg:rect
width="12"
height="12"
x="288"
y="35.999958"
id="rect12580"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1" />
</svg:g>

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

<svg:g
  id="g12578"
  style="fill:#ffff00;fill-opacity:1">
  <svg:rect
width="12"
height="12"
x="36.5"
y="69.499958"
id="rect12580"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1" />
</svg:g>

您是否知道用于简化SVG的脚本/程序?还是用于解析SVG的python-snipplet?

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

#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的大小可以大大减少而不会降低质量。 如果该工具能够降低坐标精度,那么明智地删除不必要的区域,组和样式就会很棒。

3 个答案:

答案 0 :(得分:3)

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

>>> svg = '<svg xmlns:svg="http://www.w3.org/2000/svg">' + example_svg + '</svg>'

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

>>> doc = etree.fromstring(svg)

如果您使用lxml,则可以利用XPath:

>>> ns = {'svg': 'http://www.w3.org/2000/svg'}

>>> doc.xpath('//svg:g/@transform', namespaces=ns)
<<< ['translate(-251.5,36.5)']

答案 1 :(得分:1)

您可能需要查看scour

  

Scour旨在尽可能减少SVG文件的大小,同时保留文件的原始呈现。它并不能完美地保存所有文件,因此鼓励用户不要覆盖原始文件。

     

Scour对SVG文件执行的优化包括:删除空元素,删除元数据元素,删除未使用的id =属性值,删除不可恢复的元素,将坐标修剪到一定数量的重要位置,以及删除矢量编辑器元数据。

答案 2 :(得分:0)

1)可以使用正则表达式对其进行解析和编辑。你可以很容易地得到翻译值,以及x,y's 2)如果您检查了minidom,并确定您唯一的问题是':',那么只需更换':',编辑您需要的内容,然后将其重新替换为':'。 3)您可以使用这个问题:Is there any scripting SVG editor?来学习如何更好地解析这种XML格式。