尝试使用冲刷清洁svg

时间:2019-04-23 13:37:47

标签: python svg

我尝试从python内部使用scour来清理从svgutils中出来的svg。

        from scour import scour
        options = "--remove-metadata"
        with open(input_svg, 'rb') as f1:
            with open(output_svg, 'wb') as f2:
                scour.start(options, f1, f2)

如果这样做,它将失败,并显示一个十进制错误消息:

File "C:\Users\Andreas\Anaconda3\lib\site-packages\scour\scour.py", line 2762, in scourUnitlessLength
length = getcontext().create_decimal(str(length))

InvalidOperation: [<class 'decimal.ConversionSyntax'>]

我试图在CLI中重复同样的操作,以查看是否是我的python文本错误,但出现相同的错误。 SVG似乎还不错-我什至做了一个很小的测试svg,以确保它不是来自数据的故障。

有什么我可以忽略的吗? 搜寻是从python内部清除svg的正确方法还是应该以其他方式进行?

1 个答案:

答案 0 :(得分:1)

最后...

我对问题的解决方案。

svgutils提供了一个技术上正确的svg,但始终向svg中的大小和坐标添加单位。 456.0-> 456.0pt

从技术上讲,这是错误的,因为原始单位自由值应保持这样。这真是令人窒息。可悲的是,自几年以来,搜寻社区几乎没有活动,否则值得通知他们有关其错误的信息。

我解决svgutils并一起搜索的解决方案:

from scour import scour
import svgutils
import re


sv1 = svgutils.transform.fromfile(svg_file)
# do something with the svg here

reg = re.compile("(\.\d)(pt)") # regex to search numbers with "pt"

svg = sv1.to_str().decode() # svgutils delivers ascii byte strings.
svg = reg.sub(r"\1", svg) # the incorrectly added "pt" unit is removed here

scour_options = scour.sanitizeOptions(options=None) # get a clean scour options object
scour_options.remove_metadata = True # change any option you like
clean_svg = scour.scourString(svg, options = scour_options) # use scour

这有效。 :-)