我尝试从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的正确方法还是应该以其他方式进行?
答案 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
这有效。 :-)