Обрезать рисунок SVG до размера холста в командной строке

Обрезать рисунок SVG до размера холста в командной строке

У меня есть изображения SVG, созданные PlantUML, в которых некоторые части рисунка выходят за пределы холста. Это затрудняет использование таких изображений, и мне нужно обрезать рисунок до размера холста. Поскольку я в любом случае создаю диаграммы UML с помощью скрипта, было бы очень эффективно выполнить обрезку и там.

До сих пор я пробовал две вещи: а) изменить размер холста для рисования с помощью Inkscape

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

Это работает нормально, но мне нужно обрезать рисунок до размера холста, а эта операция, похоже, недоступна.

б) изменить размер с помощью rsvg-convert

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

Это делает точное кадрирование до нужного размера, но размер изображения увеличивается примерно в 10 раз, так как теперь в SVG встроены некоторые бинарные изображения. Для меня это неприемлемо.

решение1

Я нашел неэлегантный способ сделать это, используя предложение orion. Предполагая, $svg_file_nameчто это переменная, содержащая путь к файлу изображения SVG.

Для начала нам нужна ширина и высота изображения.

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

PlantUML создает диаграмму как отдельную группу (тег <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

Связанный контент