Recadrer le dessin SVG à la taille du canevas en ligne de commande

9

J'ai des images SVG produites par PlantUML, qui a des parties de dessin en dehors de la toile. Il est difficile d'utiliser de telles images et j'ai besoin de recadrer le dessin à la taille de la toile. Comme je produis de toute façon des diagrammes UML avec un script, il serait également très efficace d'y effectuer un recadrage.

Jusqu'à présent, j'ai essayé deux choses: a) redimensionner le canevas au dessin avec Inkscape

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

Cela fonctionne bien, mais j'ai besoin de recadrer le dessin à la taille du canevas et cette opération semble indisponible.

b) redimensionner avec rsvg-convert

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

Cela recadre exactement à la taille souhaitée, mais la taille de l'image augmente ~ 10 fois car il y a maintenant des images binaires intégrées dans SVG. Ce n'est pas acceptable pour moi.

divanov
la source
Pas une réponse, juste une suggestion (je ne recherche pas les spécifications pour le moment). svgformat est un format ascii basé sur xml, donc le moyen le plus simple devrait être simplement d'utiliser sedou votre outil de manipulation de texte préféré pour insérer ou modifier une ligne qui définit le cadre de sélection. Cela ne toucherait même pas les autres contenus du fichier. Essayez de le faire manuellement une fois sur un exemple de fichier svg (dans un éditeur de texte), puis traduisez vos actions en script.
orion
La taille de la toile est très bien. Je dois recadrer tous les textes, lignes et rectangles, qui ont des parties en dehors d'une toile. Cela nécessite de comparer leurs boîtes englobantes et avec la boîte de toile. C'est beaucoup trop pour un simple script shell.
divanov
1
Oh ... Je me souviens que j'étais en colère contre Inkscape pourquoi il ne faisait pas ça. Il y avait même un rapport de bogue impliqué. Ils n'ont rien fait à ce moment-là. En outre, il n'existe aucun outil standard pour supprimer les éléments hors limites invisibles des fichiers PDF (Acrobat Pro est bien sûr l'un des pires ici). Cependant, si vous souhaitez simplement couper des éléments partiellement visibles, vous pouvez regrouper tout le contenu et placer un clip de la taille d'une boîte englobante sur tout. Ils sont toujours dans le fichier et occupent toujours de l'espace.
orion
Merci pour la suggestion. La modification de xml avec sed est légèrement dangereuse, mais toujours meilleure que l'édition manuelle.
divanov

Réponses:

5

J'ai trouvé un moyen inélégant de le faire en utilisant la proposition d'Orion. En supposant $svg_file_namequ'une variable contient le chemin du fichier vers une image SVG.

Nous avons d'abord besoin de la largeur et de la hauteur de l'image

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

PlantUML produit le diagramme en tant que groupe unique (tag <g>), plaçons le rectangle de la taille du canevas sur ce groupe

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

Maintenant, ouvrez l'image avec Inkscape, sélectionnez tout et coupez le groupe avec le rectangle

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

Avec la dernière version d'Inkscape, il faut quitter Inkscape au lieu de fermer le fichier

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name
divanov
la source
Notez que certains svgs peuvent utiliser des unités "mm" et une viewBox. Ensuite, la hauteur et la largeur doivent être ajustées en fonction de l'échelle. Plus d'infos ici .
jmiserez