コマンドラインでキャンバスのサイズに合わせて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

オリオンの提案を利用して奇妙な方法を見つけました。$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

おすすめ記事