Ich habe SVG-Bilder, die von PlantUML erstellt wurden und bei denen einige Teile der Zeichnung außerhalb der Leinwand liegen. Das erschwert die Verwendung solcher Bilder und ich muss die Zeichnung auf Leinwandgröße zuschneiden. Da ich UML-Diagramme sowieso mit Skripten erstelle, wäre es sehr effizient, auch dort ein Zuschneiden vorzunehmen.
Bisher habe ich zwei Dinge versucht: a) Größe der Leinwand mit Inkscape auf Zeichnung anpassen
inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg
Das funktioniert einwandfrei, aber ich muss die Zeichnung auf Leinwandgröße zuschneiden und dieser Vorgang scheint nicht verfügbar zu sein.
b) Größe ändern mit rsvg-convert
rsvg-convert image.svg -w 1870 -h 1195 -f svg -o image.svg
Dadurch wird das Bild exakt auf die gewünschte Größe zugeschnitten, aber die Bildgröße erhöht sich um das Zehnfache, da jetzt einige Binärbilder in SVG eingebettet sind. Das ist für mich nicht akzeptabel.
Antwort1
Ich habe mit Orions Vorschlag eine wenig elegante Möglichkeit gefunden, das zu tun. Angenommen, $svg_file_name
es handelt sich um eine Variable, die den Dateipfad zu einem SVG-Bild enthält.
Zuerst benötigen wir Bildbreite und -höhe
width=$(exiftool -ImageWidth $svg_file_name | sed "s/.*: //;s/pt//g")
height=$(exiftool -ImageHeight $svg_file_name | sed "s/.*: //;s/pt//g")
PlantUML erzeugt das Diagramm als einzelne Gruppe (Tag <g>
). Platzieren wir ein Rechteck in Leinwandgröße über dieser Gruppe
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
Öffnen Sie nun das Bild mit Inkscape, wählen Sie alles aus und schneiden Sie die Gruppe mit dem Rechteck aus
inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileClose $svg_file_name
Mit der neuesten Version von Inkscape muss man Inkscape beenden, anstatt die Datei zu schließen
inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name