명령줄에서 캔버스 크기에 맞게 SVG 그림 자르기

명령줄에서 캔버스 크기에 맞게 SVG 그림 자르기

PlantUML에서 생성한 SVG 이미지가 있는데 그 중 일부는 캔버스 외부에 그려져 있습니다. 이로 인해 이러한 이미지 작업이 어려워지므로 그림을 캔버스 크기에 맞게 잘라야 합니다. 어쨌든, 스크립트로 UML 다이어그램을 생성할 때 거기에서 클리핑을 수행하는 것도 매우 잘 작동할 것입니다.

지금까지 나는 두 가지를 시도했습니다. a) Inkscape로 그릴 수 있도록 캔버스 크기를 조정합니다.

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

이것은 잘 작동하지만 그림을 캔버스 크기에 맞춰 잘라야 하는데 이 기능을 사용할 수 없는 것 같습니다.

b) rsvg-convert를 사용하여 크기를 조정합니다.

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

이렇게 하면 원하는 크기로 잘리지만 이제 SVG에 일부 이진 이미지가 포함되어 있으므로 이미지 크기가 약 10배 증가합니다. 이것은 나에게 용납될 수 없는 일이다.

답변1

오리온의 제안을 이용해서 엉뚱한 방법을 찾아냈습니다. $svg_file_nameSVG 이미지 파일의 경로를 포함하는 변수라고 가정해 보겠습니다 .

먼저 이미지의 너비와 높이가 필요합니다.

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

PlantUML은 다이어그램을 단일 그룹(markers <g>)으로 생성합니다. 그룹 위에 캔버스 크기의 직사각형을 배치해 보겠습니다.

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

이제 inkscape에서 이미지를 열고 모두 선택하고 직사각형으로 그룹을 자릅니다.

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

최신 Inkscape를 사용하면 파일을 닫는 대신 Inkscape를 종료해야 합니다.

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

관련 정보