我第一次需要表演差异在使用 Inkscape 创建的 SVG 文件上,因为我在 SVN 中遇到冲突。
在检查差异时,我注意到 SVG 文件包含大量个人信息。个人信息与用于导出的路径有关。SVG 源代码如下所示:
<text ... inkscape:export-filename="<personal information here>" ... />
对我来说,它有很多文件夹名称可以追溯到我 2009 年从事的项目。
如何从 Inkscape SVG 文件中删除这些个人信息?
当然,我可以在文本编辑器中手动完成此操作,但这样做有一些缺点:
- 它很容易出错。你需要非常清楚自己在做什么。应该有更安全的方法来实现它。
- 这很耗时。应该有更快捷的方法。
- 它可能不完整。也许还有其他我尚未发现的个人数据。
答案1
最简单的方法是将文件另存为文件Optimized SVG
。此选项在对话框下拉菜单中可用Save As...
。单击“保存”时,将弹出一个对话框,询问您要删除的内容。确保框Keep Editor Data
留在未选中。
答案2
我有很多来自不同来源的 SVG,所以我在寻找自动化解决方案。
1.SVGO(NodeJS,javascript)
有一个非常好的NPM包:超音速巡航机
由于我使用gulp
作为任务运行器,因此gulp-svgmin(或者gulp-svgo)非常有帮助
2. XSLT(转换 SVG)
另一种自动化方法——使用 XSLT。以下是一个 XSL 转换我曾经用来清理 SVG。
此 XSLT 执行以下操作:
- 删除所有
inkscape
和sodipodi
属性 - 删除所有
inkscape
和sodipodi
元素 - 删除
metadata
所有祖先元素 - 删除
style
属性(我们使用 CSS)- 仅当变量preserve-style
设置为false
作为输出,您将获得干净的 SVG 文件。
如何运行转型
Javascript(gulp 构建)
如果你使用吞咽作为构建系统,您可以使用以下插件:
- gulp-xslt
- 或者gulp-saxon
saxon.jar
需要在系统中存在
Python 和 lxml.etree
使用这个简短的 Python 脚本:
#!/usr/bin/python
import lxml.etree as ET
def clean_file(path, pathto):
svg1 = ET.parse(path)
xslt = ET.parse('cleanup-svg.xsl')
transform = ET.XSLT(xslt)
svg2 = transform(svg1)
with open(pathto, 'w') as f:
f.write(ET.tostring(svg2, pretty_print=True))
clean_file('a.svg', 'b.svg')