У меня есть изображения 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