Ritaglia disegno SVG in base alle dimensioni della tela nella riga di comando


9

Ho immagini SVG prodotte da PlantUML, che ha alcune parti del disegno al di fuori della tela. Rende difficile usare tali immagini e ho bisogno di ritagliare il disegno in base alle dimensioni della tela. Dato che produco comunque diagrammi UML con script, sarebbe davvero efficace eseguire anche un ritaglio lì.

Finora ho provato due cose: a) ridimensionare la tela al disegno con Inkscape

inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Funziona bene, ma devo ritagliare il disegno in base alle dimensioni della tela e questa operazione sembra non essere disponibile.

b) ridimensionare con rsvg-convert

rsvg-convert image.svg -w 1870 -h 1195 -f svg -o image.svg

Questo si adatta esattamente alla dimensione desiderata, ma la dimensione dell'immagine aumenta di circa 10 volte poiché ora ci sono alcune immagini binarie incorporate in SVG. Questo non è accettabile per me.


Non una risposta, solo un suggerimento (non sto cercando le specifiche in questo momento). svgIl formato è un formato ASCII basato su XML, quindi il modo più semplice dovrebbe essere solo quello di utilizzare sedo il tuo strumento di manipolazione del testo preferito per inserire o modificare una linea che imposta il riquadro di delimitazione. Questo non toccherebbe nemmeno gli altri contenuti del file. Prova a farlo manualmente una volta su un file svg di esempio (in un editor di testo) e poi traduci le tue azioni in uno script.
Orion,

Le dimensioni della tela vanno bene. Devo ritagliare tutti i testi, le linee e i rettangoli, che hanno parti al di fuori di una tela. Ciò richiede il confronto dei loro riquadri di delimitazione e della casella di tela. Questo è molto per un semplice script di shell.
divanov,

1
Oh ... ricordo che ero arrabbiato per Inkscape perché non lo faceva. È stato persino segnalato un bug. Non hanno fatto nulla al riguardo in quel momento. Inoltre, non esistono strumenti standard per rimuovere elementi invisibili fuori campo dai file pdf (Acrobat Pro è ovviamente uno dei peggiori qui). Tuttavia, se si desidera solo ritagliare elementi parzialmente visibili, è possibile raggruppare l'intero contenuto e inserire un clip di dimensioni limitate su tutto. Tuttavia, sono ancora nel file e occupano ancora spazio.
Orion,

Grazie per il suggerimento Modificare xml con sed è leggermente pericoloso, ma è ancora meglio della modifica manuale.
divanov,

Risposte:


5

Ho trovato un modo inelegante per farlo usando la proposta di Orion. Supponendo che $svg_file_namesia una variabile che contiene il percorso del file a un'immagine SVG.

Per prima cosa abbiamo bisogno della larghezza e dell'altezza dell'immagine

width=$(exiftool -ImageWidth $svg_file_name | sed "s/.*: //;s/pt//g")
height=$(exiftool -ImageHeight $svg_file_name | sed "s/.*: //;s/pt//g")

PlantUML produce il diagramma come un singolo gruppo (tag <g>), posizioniamo un rettangolo delle dimensioni della tela su quel gruppo

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

Ora apri l'immagine con inkscape, seleziona tutto e ritaglia il gruppo con il rettangolo

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileClose $svg_file_name

Con l'ultimo Inkscape è necessario uscire da Inkscape invece di chiudere il file

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name

Si noti che alcuni svg potrebbero utilizzare unità "mm" e un viewBox. Quindi l'altezza e la larghezza devono essere regolate in base al ridimensionamento. Maggiori informazioni qui .
jmiserez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.