Вопрос или проблема
Как мне конвертировать SVG (содержащий несколько латинских слов и простую векторную графику) в PDF на Linux?
Я пробовал Inkscape 0.47 на Ubuntu Lucid, но он случайным образом смещает некоторые подграфики и делает некоторые линии короче в выходном PDF. Поэтому его вывод бесполезен, так как графика выглядит совершенно иначе.
Я пробовал открыть SVG в Google Chrome 16 и распечатать его в PDF, но он искажает все цвета и удаляет некоторые элементы. (SVG отображается нормально на экране, но уже плохо в предварительном просмотре печати и сгенерированный PDF тоже плохой)
Я не хочу растеризовать или рендерить SVG. Решение, которое конвертирует SVG в битмапное изображение, а затем создает PDF с встроенным изображением, не является ответом на мой вопрос. (Для справки, Inkscape 0.47 рендерит текст очень некрасиво, без сглаживания, при рендеринге в PNG)
Есть ли другие варианты?
rsvg-convert решает задачу для SVG, который я хотел конвертировать:
$ sudo apt-get install librsvg2-bin
$ rsvg-convert -f pdf -o t.pdf t.svg
rsvg-convert -f pdf
не растеризует SVG, и он встраивает и подмножит шрифты (по крайней мере, он встроил используемые символы шрифта Arial). Иногда встраивание шрифта не удается (например, для шрифта LMRoman17), и весь файл шрифта копируется в сгенерированный PDF.
Зависимости на Ubuntu Lucid:
- libcairo.so.2
- libgobject-2.0.so.0
- libgthread-2.0.so.0
- libglib-2.0.so.0
- librsvg-2.so.2
- libpthread.so.0
- libc.so.6
По умолчанию, libcairo требует libX11, поэтому rsvg-convert может быть трудно установить на бездисковую систему.
Примечание:
В man-странице rsvg-convert
говорится, что инструмент всегда растеризует, но это не так. Руководство просто устарело. Иногда ваш инструмент генерации SVG может частично растеризовать изображение SVG, что также может ввести вас в заблуждение.
Это работает на Ubuntu Lucid:
$ sudo apt-get install inkscape
$ inkscape t.svg --export-pdf=t.pdf
Вышеуказанный вызов Inkscape из командной строки работает даже в бездисковом режиме, без графического интерфейса (DISPLAY=
). Однако установка Inkscape устанавливает множество зависимостей, включая X11.
Обратите внимание, что выходной статус Inkscape всегда 0, даже если произошла ошибка — так что следите за его stderr.
Существует также inkscape --shell
, подходит для конвертации множества документов пакетно. Это позволяет избежать медленного времени загрузки Inkscape для каждого файла:
$ (echo t.svg --export-pdf=t.pdf;
echo u.svg --export-pdf=u.pdf) |
DISPLAY= inkscape --shell
Inkscape также полезен для упрощения SVG:
$ DISPLAY= inkscape t.svg --export-plain-svg=t.plain.svg
Я успешно использовал CairoSVG на OSX и Ubuntu.
pip install cairosvg
cairosvg in.svg -o out.pdf
Мне интересно, почему это не было упомянуто раньше, но я протестировал кучу различных конвертеров svg->pdf и выяснил, что лучший из них — Headless Chrome. Он дает самые точные результаты для меня. Прежде чем переключиться на Chrome, я пытался бороться с ошибками Inkscape, но многие из них слишком серьезные, и я не могу долго с этим ничего сделать (ошибки прозрачности, неправильные шрифты и т.д.).
chrome \
--headless \
--disable-gpu \
--no-pdf-header-footer \
--print-to-pdf=output.pdf \
input.svg
Ему нужны некоторые настройки для использования пользовательского размера PDF (A4 или US Letter по умолчанию в зависимости от вашей системы?), но я смог установить пользовательский размер после некоторого поиска в Google и игры с атрибутами CSS и SVG (посмотрите этот ответ на stackoverflow)
Обновление с примером размещения CSS для размера страницы в блоке <style>
в SVG:
<svg
width="154.63478"
height="213.94911"
... >
<style>
@page {
size: 155mm 214mm;
margin: 0;
}
</style>
<!-- Ваш контент SVG здесь -->
</svg>
Я получаю хорошие результаты от печати из Inkscape (0.47 тоже) в PDF и для сохранения в PDF (но немного другие), но это может зависеть от конкретной графики.
Альтернативное решение с более низким разрешением (я не пробовал переключатели для его улучшения) выглядит так:
convert file.svgz file.pdf
convert
является частью пакета ImageMagick
.
Rasterizer это другая программа:
rasterizer -m application/pdf file.svgz -d file.pdf
Чтобы выяснить, какие программы, обрабатывающие SVG, установлены на вашей системе, просто попробуйте:
apropos -s 1 svg
Документация для этих программ должна объяснить, полезна ли программа для конвертации SVG в PDF.
https://superuser.com/a/79064/19956 упоминает gsvg, часть GhostPDL.
Я пробовал gsvg ghostpdl-9.06 на Ubuntu Lucid, но он не сработал для двух SVG, сгенерированных Inkscape. Один SVG содержал текст, другой — только векторную графику. Также не сработал для простой графики без расширений Inkscape или clip-path. Поэтому я не считаю gsvg удобным конвертером SVG в PDF.
На Mac OS (при условии, что у вас уже установлен brew) я делаю:
$ brew install cairo libffi python3
$ pip3 install cairosvg
$ cairosvg -o blah.pdf ./blah.svg
То же самое должно работать и на Linux, но с apt-get вместо этого.
Ответ @pts не работает с недавними версиями Inkscape (1.0 и новее). Чтобы конвертировать файл SVG в PDF:
inkscape --export-type=pdf my_file.svg
Это экспортирует его в my_file.pdf
.
Если вы хотите указать другое имя для вашего PDF-документа, используйте:
inkscape my_file.svg -o new_name.pdf
Отличное решение, Avael Kross (https://superuser.com/users/1057244/avael-kross)!! Headless Chrome отлично сработал для меня.
Я автоматизировал процедуру удаления заголовка и подвала из выходного PDF и подгонки его под размер SVG.
Я загрузил скрипт оболочки в следующий гист.
svg2pdf.bash:
https://gist.github.com/s417-lama/84bf66de1096c4587e8187092fb41684
Использование:
$ ./svg2pdf.bash input.svg output.pdf
Откройте файл svg с помощью Image Viewer
(также называется Eye of Gnome eog
) и распечатайте его в файл PDF (скажем, image.pdf
) и сконвертируйте этот pdf в eps с помощью команды pdf2ps
. Просто!
Подробные шаги:
-
Установите
Image Viewer
, если еще не сделали (что маловероятно, если вы используетеgnome
)sudo apt-get install eog
-
Откройте SVG файл с
eog
и распечатайте его в файлimage.pdf
. -
(Опционально) Удалите окружающий пробел из PDF файла:
pdfcrop image.pdf
Это создаст
image-crop.pdf
с удаленным окружающим пробелом. -
Конвертируйте обрезанный PDF в eps (используйте
image.pdf
напрямую, если вы не обрезали PDF)pdf2ps image-crop.pdf image.eps
Вот и все!
Большинство инструментов, упомянутых здесь, имеют проблемы при отображении SVG 1.1. Поэтому я использовал следующее решение:
- Большинство браузеров, кажется, являются лучшими просмотрщиками для SVG. Firefox и Chrome поддерживают SVG 1.1 в полном объеме. Я просто отобразил SVG в браузере.
- Затем распечатал страницу в PDF, при этом:
- вставляя изображение на страницу
- устанавливая все поля страницы в 0
- оставляя все заголовки и подвал пустыми
- Так как вы не можете отклоняться от предопределенных размеров страниц, я позже использовал
pdfcrop
, чтобы получить PDF с точными размерами SVG.
Это можно сделать с помощью Inkscape
inkscape input.svg -o output.pdf
Вы также можете обрезать SVG по его содержимому так:
inkscape input.svg -o output.pdf --export-area-drawing
Ответ или решение
Конвертация SVG в PDF на Linux может быть выполнена разными способами, в зависимости от ваших требований и наличия необходимых инструментов. Ниже представлено несколько эффективных методов, которые помогут вам успешно выполнить эту задачу.
1. Использование rsvg-convert
rsvg-convert
является инструментом, частью пакета librsvg
, и является одним из самых надежных способов конвертации SVG в PDF без растрирования изображения. Вы можете установить его с помощью следующей команды:
sudo apt-get install librsvg2-bin
После установки вы можете конвертировать SVG в PDF, выполнив команду:
rsvg-convert -f pdf -o output.pdf input.svg
Этот метод поддерживает встраивание шрифтов, что особенно важно для текстовых элементов в вашем SVG.
2. Использование Inkscape
Inkscape также предоставляет возможность конвертировать SVG в PDF и подходит для пользователей, которые уже знакомы с графическими редакторами. Для этого сначала установите Inkscape:
sudo apt-get install inkscape
Затем выполните конвертацию с помощью следующей команды:
inkscape input.svg -o output.pdf
Inkscape можно использовать в безголовом режиме (без графического интерфейса):
DISPLAY= inkscape input.svg -o output.pdf
Однако стоит иметь в виду, что при использовании Inkscape может возникнуть некоторая зависимость от графической системы.
3. Использование Headless Chrome
Headless Chrome позволяет конвертировать SVG в PDF с высокой точностью. Убедитесь, что у вас установлен Chrome, и выполните следующую команду:
chrome --headless --disable-gpu --no-pdf-header-footer --print-to-pdf=output.pdf input.svg
С помощью этой команды вы получите точный PDF, соответствующий исходному SVG, с возможностью настроить размеры страницы с помощью CSS внутри SVG.
4. Использование CairoSVG
CairoSVG — это Python-библиотека, которая может быть использована для конвертации SVG в PDF. Установите её следующей командой:
pip install cairosvg
Затем выполните конвертацию:
cairosvg input.svg -o output.pdf
CairoSVG предоставляет высокое качество конвертирования и является достойной альтернативой.
5. Использование браузеров
Вы также можете открыть SVG-файл в браузере, например, Firefox или Chrome, и воспользоваться функцией печати (Ctrl + P) для сохранения в формате PDF. Убедитесь, что в настройках печати вы убрали все заголовки и поля, чтобы получить максимально точное отображение.
Заключение
Существует несколько способов конвертации SVG в PDF на Linux, и выбор метода зависит от ваших предпочтений и требований. Использование rsvg-convert
и Inkscape
обеспечивает высокое качество результирующего файла. Также стоит рассмотреть использование Headless Chrome
для точной конвертации. Выбор инструмента будет зависеть от ваших нужд, будь то работа с текстом, сохранение графики или отсутствие графической среды.