Tenho imagens SVG produzidas pelo PlantUML, que possui algumas partes do desenho fora do canvas. Isso dificulta o uso dessas imagens e preciso cortar o desenho no tamanho da tela. Como eu produzo diagramas UML com script de qualquer maneira, seria muito eficiente realizar um recorte lá também.
Até agora tentei duas coisas: a) redimensionar a tela para desenho com o Inkscape
inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg
Isso funciona bem, mas preciso cortar o desenho no tamanho da tela e esta operação parece não estar disponível.
b) redimensionar com rsvg-convert
rsvg-convert image.svg -w 1870 -h 1195 -f svg -o image.svg
Isso corta exatamente no tamanho desejado, mas o tamanho da imagem aumenta cerca de 10 vezes, pois agora existem algumas imagens binárias incorporadas no SVG. Isso não é aceitável para mim.
Responder1
Encontrei uma maneira deselegante de fazer isso usando a proposta da Orion. Supondo que $svg_file_name
seja uma variável que contém o caminho do arquivo para uma imagem SVG.
Primeiro precisamos da largura e altura da imagem
width=$(exiftool -ImageWidth $svg_file_name | sed "s/.*: //;s/pt//g")
height=$(exiftool -ImageHeight $svg_file_name | sed "s/.*: //;s/pt//g")
PlantUML produz o diagrama como um único grupo (tag <g>
), vamos colocar um retângulo do tamanho da tela sobre esse 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
Agora abra a imagem com o inkscape, selecione tudo e recorte o grupo com o retângulo
inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileClose $svg_file_name
Com o Inkscape mais recente, é necessário sair do Inkscape em vez de fechar o arquivo
inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name