Cortar o desenho SVG no tamanho da tela na linha de comando

9

Tenho imagens SVG produzidas pelo PlantUML, que tem algumas partes do desenho fora da tela. 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 realmente eficiente executar um corte lá também.

Até agora, tentei duas coisas: a) redimensionar a tela para desenhar 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 estar indisponível.

b) redimensionar com rsvg-convert

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

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

divanov
fonte
Não é uma resposta, apenas uma sugestão (não estou pesquisando as especificações agora). svgformat é um formato ascii baseado em xml; portanto, a maneira mais fácil deve ser usar sedou sua ferramenta de manipulação de texto favorita para inserir ou modificar uma linha que define a caixa delimitadora. Isso nem tocaria o outro conteúdo do arquivo. Tente fazê-lo manualmente uma vez em um arquivo svg de exemplo (em um editor de texto) e depois traduza suas ações em um script.
orion
O tamanho da tela é bom. Eu tenho que cortar todos os textos, linhas e retângulos, que têm partes fora de uma tela. Isso requer a comparação de suas caixas delimitadoras e da caixa de lona. Isso é muito para apenas um script de shell.
Divanov
1
Ah ... eu lembro que fiquei com raiva do inkscape por que isso não acontece. Havia até um relatório de bug envolvido. Eles não fizeram nada sobre isso naquele momento. Além disso, não existem ferramentas padrão para remover coisas fora dos limites invisíveis dos arquivos pdf (o Acrobat Pro é, obviamente, um dos piores aqui). No entanto, se você quiser apenas recortar coisas parcialmente visíveis, poderá agrupar todo o conteúdo e colocar um clipe do tamanho de uma caixa delimitadora sobre tudo. Eles ainda estão no arquivo e ainda ocupam espaço.
orion
Obrigado pela sugestão. Alterar xml com sed é um pouco perigoso, mas ainda melhor que a edição manual.
divanov

Respostas:

5

Encontrei uma maneira deselegante de fazer isso usando a proposta do orion. Supondo que $svg_file_nameé 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 o 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 corte 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
divanov
fonte
Observe que alguns svgs podem usar unidades "mm" e uma viewBox. Em seguida, a altura e a largura precisam ser ajustadas de acordo com a escala. Mais informações aqui .
precisa saber é