コマンドラインでSVG描画をキャンバスサイズに切り取る

コマンドラインでSVG描画をキャンバスサイズに切り取る

PlantUML で作成した SVG 画像がありますが、キャンバスの外側に描画部分があります。このような画像の使用は難しく、キャンバス サイズに合わせて描画を切り取る必要があります。いずれにしてもスクリプトで UML 図を作成するので、そこでも切り取りを実行すると非常に効率的です。

これまで2つのことを試しました。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

これにより、希望のサイズに正確に切り取られますが、SVG にバイナリ イメージが埋め込まれるため、イメージ サイズが約 10 倍に増加します。これは私にとって受け入れられません。

答え1

私は、Orion の提案を使用して、それを実行するあまり洗練されていない方法を見つけました。 は、$svg_file_nameSVG 画像へのファイル パスを含む変数であると想定します。

まず画像の幅と高さが必要です

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

関連情報