コマンドラインでSVG描画をキャンバスサイズにトリミングする


9

私は、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倍に増加します。これは私には受け入れられません。


答えではなく、単なる提案です(現在、仕様を調べていません)。svgformatはxmlベースのASCII形式であるため、最も簡単な方法はsed、境界ボックスを設定する行を挿入または変更するために、またはお気に入りのテキスト操作ツールを使用することです。これは、ファイルの他のコンテンツには影響しません。例のsvgファイル(テキストエディターで)に対して手動で一度実行してから、アクションをスクリプトに変換します。
オリオン2014年

キャンバスサイズで結構です。キャンバスの外側にある部分を持つすべてのテキスト、線、および長方形をトリミングする必要があります。そのためには、バウンディングボックスとキャンバスボックスを比較する必要があります。これは、シェルスクリプトだけの方法です。
divanov 2014年

1
ああ...インクスケープに怒っていたのはなぜそれができないのか覚えています。バグレポートも含まれていました。当時彼らはそれについて何もしていませんでした。また、pdfファイルから見えない範囲外のものを削除する標準ツールはありません(もちろん、Acrobat Proはここで最悪の1つです)。ただし、部分的に表示されているものだけをクリップする場合は、コンテンツ全体をグループ化し、境界ボックスサイズのクリップをすべてに配置できます。ただし、それらはまだファイル内にあり、スペースを占有します。
オリオン2014年

提案ありがとうございます。sedでxmlを変更することは少し危険ですが、手動で編集するよりも優れています。
divanov 2014年

回答:


5

私はオリオンの提案を使用してそれを行うためのエレガントな方法を見つけました。仮定$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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.