Как конвертировать SVG в PDF на Linux

Вопрос или проблема

Как мне конвертировать 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

Документация по CairoSVG

Мне интересно, почему это не было упомянуто раньше, но я протестировал кучу различных конвертеров 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. Просто!

Подробные шаги:

  1. Установите Image Viewer, если еще не сделали (что маловероятно, если вы используете gnome)

    sudo apt-get install eog
    
  2. Откройте SVG файл с eog и распечатайте его в файл image.pdf.

  3. (Опционально) Удалите окружающий пробел из PDF файла:

    pdfcrop image.pdf
    

    Это создаст image-crop.pdf с удаленным окружающим пробелом.

  4. Конвертируйте обрезанный PDF в eps (используйте image.pdf напрямую, если вы не обрезали PDF)

    pdf2ps image-crop.pdf image.eps
    

Вот и все!

Большинство инструментов, упомянутых здесь, имеют проблемы при отображении SVG 1.1. Поэтому я использовал следующее решение:

  1. Большинство браузеров, кажется, являются лучшими просмотрщиками для SVG. Firefox и Chrome поддерживают SVG 1.1 в полном объеме. Я просто отобразил SVG в браузере.
  2. Затем распечатал страницу в PDF, при этом:
    • вставляя изображение на страницу
    • устанавливая все поля страницы в 0
    • оставляя все заголовки и подвал пустыми
  3. Так как вы не можете отклоняться от предопределенных размеров страниц, я позже использовал 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 для точной конвертации. Выбор инструмента будет зависеть от ваших нужд, будь то работа с текстом, сохранение графики или отсутствие графической среды.

Оцените материал
Добавить комментарий

Капча загружается...