我有 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