在命令行中将SVG绘图裁剪为画布大小


9

我有PlantUML制作的SVG图像,该图像的某些部分在画布之外。这使使用此类图像变得困难,我需要将绘图裁剪为画布大小。无论如何我用脚本生成UML图时,在该处执行裁剪也将非常有效。

到目前为止,我已经尝试了两件事:a)调整画布大小以使用Inkscape进行绘制

inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

这可以正常工作,但我需要将绘图裁剪为画布大小,并且此操作似乎不可用。

b)使用rsvg-convert调整大小

rsvg-convert image.svg -w 1870 -h 1195 -f svg -o image.svg

这确实可以裁剪到所需的大小,但是图像大小增加了约10倍,因为现在在SVG中嵌入了一些二进制图像。这对我来说是不可接受的。


没有答案,只是一个建议(我现在不查找规格)。svgformat是基于xml的ascii格式,因此最简单的方法应该是使用sed或您喜欢的文本处理工具来插入或修改设置边界框的行。这甚至都不会触及文件的其他内容。尝试在一个示例svg文件上(在文本编辑器中)手动执行一次,然后将您的操作转换为脚本。
Orion 2014年

画布大小很好。我必须裁剪所有文本,线条和矩形,这些文本,线条和矩形的一部分在画布之外。那需要比较它们的边界框和画布框。对于shell脚本来说,这是很多方法。
divanov 2014年

1
哦,我记得我为inkscape感到生气,为什么它不这样做。甚至有一个错误报告。当时他们什么也没做。此外,没有标准工具可从pdf文件中删除不可见的越界内容(Acrobat Pro当然是最差的工具之一)。但是,如果您只想剪辑部分可见的内容,则可以将全部内容分组,然后将边框大小的剪辑放在所有内容上。但是它们仍然在文件中,并且仍然占用空间。
Orion

感谢您的建议。用sed更改xml有点危险,但仍然比手动编辑更好。
divanov 2014年

Answers:


5

我发现使用Orion的建议可以做到这一点。假设$svg_file_name是一个包含SVG图像文件路径的变量。

首先我们需要图像的宽度和高度

width=$(exiftool -ImageWidth $svg_file_name | sed "s/.*: //;s/pt//g")
height=$(exiftool -ImageHeight $svg_file_name | sed "s/.*: //;s/pt//g")

PlantUML将图生成为单个组(标签<g>),让我们在该组上放置画布大小的矩形

sed -i "s|</g>|</g><polygon fill=\"#FFFFFF\" points=\"0,0,0,$height,$width,$height,$width,0\" style=\"stroke: #000000; stroke-width: 1.0;\"/>|" $svg_file_name

现在使用inkscape打开图像,选择全部并用矩形裁剪组

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileClose $svg_file_name

使用最新的Inkscape,需要退出Inkscape而不是关闭文件

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name

请注意,某些svg可能会使用“ mm”单位和viewBox。然后需要根据缩放比例调整高度和宽度。更多信息在这里
jmiserez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.