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

9

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

Divanov
источник
Не ответ, просто предложение (сейчас я не смотрю спецификации). svgformat - это основанный на xml формат ascii, поэтому самый простой способ - просто использовать sedили ваш любимый инструмент для работы с текстом, чтобы вставить или изменить строку, которая устанавливает ограничивающий прямоугольник. Это даже не коснется другого содержимого файла. Попробуйте сделать это вручную один раз на примере файла SVG (в текстовом редакторе), а затем переведите свои действия в сценарий.
Орион
Размер холста в порядке. Я должен обрезать все тексты, линии и прямоугольники, у которых есть части вне холста. Это требует сравнения их ограничивающих рамок и холстовой рамки. Это способ для всего лишь сценария оболочки.
Диванов
1
Ох ... Я помню, что я был зол на Inkscape, почему он этого не делает. Был даже отчет об ошибке. В то время они ничего не делали. Кроме того, нет стандартных инструментов для удаления невидимых заурядных файлов из PDF-файлов (Acrobat Pro, конечно, один из худших здесь). Однако, если вы просто хотите обрезать частично видимый материал, вы можете сгруппировать все содержимое и поместить клип размером с ограничивающий прямоугольник поверх всего. Они все еще находятся в файле, и они все еще занимают место.
Орион
Спасибо за предложение. Изменение xml с помощью sed немного опасно, но все же лучше, чем ручное редактирование.
Диванов

Ответы:

5

Я нашел неумелый способ сделать это, используя предложение Ориона. Предполагается, $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
Divanov
источник
Обратите внимание, что некоторые svgs могут использовать единицы «мм» и viewBox. Затем высота и ширина должны быть отрегулированы в соответствии с масштабированием. Больше информации здесь .
jmiserez