Recorte el dibujo SVG al tamaño del lienzo en la línea de comando

9

Tengo imágenes SVG producidas por PlantUML, que tiene algunas partes de dibujo fuera del lienzo. Hace que sea difícil usar esas imágenes y necesito recortar el dibujo al tamaño del lienzo. Como produzco diagramas UML con script de todos modos, sería realmente eficiente realizar un recorte allí también.

Hasta ahora he intentado dos cosas: a) cambiar el tamaño del lienzo para dibujar con Inkscape

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

Esto funciona bien, pero necesito recortar el dibujo al tamaño del lienzo y esta operación parece no estar disponible.

b) cambiar el tamaño con rsvg-convert

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

Esto hace exactamente el recorte al tamaño deseado, pero el tamaño de la imagen aumenta ~ 10 veces ya que ahora hay algunas imágenes binarias incrustadas en SVG. Esto no es aceptable para mi.

divanov
fuente
No es una respuesta, solo una sugerencia (no estoy buscando las especificaciones en este momento). svgformat es un formato ascii basado en xml, por lo que la forma más fácil debería ser usar sedsu herramienta de manipulación de texto favorita para insertar o modificar una línea que establece el cuadro delimitador. Esto ni siquiera tocaría los otros contenidos del archivo. Intente hacerlo manualmente una vez en un archivo svg de ejemplo (en un editor de texto) y luego traduzca sus acciones en un script.
orion
El tamaño del lienzo está bien. Tengo que recortar todos los textos, líneas y rectángulos, que tienen partes fuera de un lienzo. Eso requiere comparar sus cuadros delimitadores y con el cuadro de lienzo. Esto es demasiado para solo un script de shell.
divanov
1
Oh ... recuerdo que estaba enojado por inkscape por qué no hace eso. Incluso hubo un informe de error involucrado. No hicieron nada al respecto en ese momento. Además, no hay herramientas estándar para eliminar material invisible fuera de los límites de los archivos pdf (Acrobat Pro, por supuesto, es uno de los peores aquí). Sin embargo, si solo desea recortar cosas parcialmente visibles, puede agrupar todo el contenido y colocar un clip del tamaño de un cuadro delimitador sobre todo. Sin embargo, todavía están en el archivo y todavía ocupan espacio.
orion
Gracias por la sugerencia. Alterar xml con sed es un poco peligroso, pero aún mejor que la edición manual.
divanov

Respuestas:

5

Encontré una manera poco elegante de hacerlo usando la propuesta de Orion. Suponiendo que $svg_file_namees una variable que contiene la ruta del archivo a una imagen SVG.

Primero necesitamos ancho y alto de imagen

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

PlantUML produce el diagrama como un solo grupo (etiqueta <g>), coloquemos un rectángulo de tamaño de lienzo sobre ese grupo

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

Ahora abra la imagen con Inkscape, seleccione todo y recorte el grupo con el rectángulo

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

Con la última versión de Inkscape, es necesario salir de Inkscape en lugar de cerrar el archivo

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name
divanov
fuente
Tenga en cuenta que algunos svgs pueden usar unidades "mm" y un viewBox. Luego, la altura y el ancho deben ajustarse de acuerdo con la escala. Más información aquí .
jmiserez