Tengo imágenes SVG producidas por PlantUML, que tiene algunas partes del dibujo fuera del lienzo. Hace que sea difícil utilizar este tipo de imágenes y necesito recortar el dibujo al tamaño de un lienzo. Como de todos modos produzco diagramas UML con script, sería muy eficiente realizar un recorte allí también.
Hasta ahora he probado 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 recorta exactamente 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 mí.
Respuesta1
Encontré una manera poco elegante de hacerlo usando la propuesta de Orión. Suponiendo que $svg_file_name
es una variable que contiene la ruta del archivo a una imagen SVG.
Primero necesitamos el ancho y alto de la 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 del tamaño de un 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