Recorte o desenho SVG para o tamanho da tela na linha de comando

8

Eu tenho imagens SVG produzidas pelo PlantUML, que tem algumas partes do desenho fora da tela. Isso dificulta o uso de tais imagens e eu preciso recortar o desenho para o tamanho da tela. Como eu produzo diagramas UML com scripts de qualquer maneira, seria muito eficiente executar um corte também.

Até agora eu tentei duas coisas: a) redimensione a tela para desenhar com o Inkscape

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

Isso funciona bem, mas eu preciso recortar o desenho para o tamanho da tela e esta operação parece estar indisponível.

b) redimensionar com rsvg-convert

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

Isso faz o corte exatamente no tamanho desejado, mas o tamanho da imagem aumenta ~ 10 vezes, já que agora há algumas imagens binárias incorporadas no SVG. Isso não é aceitável para mim.

    
por divanov 07.05.2014 / 14:45

1 resposta

5

Eu encontrei uma maneira deselegante de fazer isso usando a proposta do Orion. Assumindo que $svg_file_name é uma variável contendo 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 de tamanho de 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 corte o grupo com o retângulo

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

Com o mais recente Inkscape, é necessário sair do Inkscape em vez de fechar o arquivo

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name
    
por 07.05.2014 / 16:09