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

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

我有 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 中。这对我来说是不能接受的。

答案1

我使用 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

相关内容