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

126

Как мне конвертировать и SVG (содержащий несколько слов латинского текста и простую векторную графику) в PDF на Linux?

Я попробовал Inkscape 0.47 на Ubuntu Lucid, но он перемещает некоторую субграфику случайным образом и делает несколько строк короче в выходном PDF. Таким образом, его вывод бесполезен, потому что графика выглядит совершенно иначе.

Я попытался открыть SVG в Google Chrome 16 и распечатать его в PDF, но он искажает все цвета, а также удаляет некоторые элементы. (SVG выглядит нормально на экране, но он уже плох в предварительном просмотре и сгенерированный PDF тоже плох.)

Я не хочу растеризовать или визуализировать SVG. Решение, которое преобразует SVG в растровое изображение, а затем создает PDF-файл со встроенным изображением, не является ответом на мой вопрос. (FYI Inscape 0.47 отображает текст очень безобразно, без сглаживания при рендеринге в PNG.)

Какие еще варианты у меня есть?

PTS
источник
1
Если у вас есть несколько изображений для конвертации, вам может быть проще использовать некоторые из онлайн-конвертеров. Я попробовал CloudConvert, и он сделал очень хорошую работу с половиной размера файла SVG.
Фрэнк

Ответы:

134

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 может быть сложно установить в автономную систему.

Примечание: на странице руководства rsvg-convertговорится, что инструмент всегда растеризуется, но это не так. Руководство просто устарело. Иногда ваш инструмент создания SVG может частично растеризовать изображение SVG, что также может ввести вас в заблуждение.

PTS
источник
4
Я вижу здесь много зависимостей: Каир, libgphoto, gtk3, libsane ... О, хорошо, если это сделает свою работу ...
ShiDoiSi
4
@ AyberkÖzgür Это ошибка inkscape - когда вы сохраняете проект Inkscape, он по умолчанию сохраняет его как SVG, но сохраняемый SVG включает в себя набор нестандартных специфичных для inkscape данных, которые могут часто приводить в замешательство другие программы. Вам нужно экспортировать как SVG, а не просто сохранить как SVG.
AJMansfield
2
Может сэкономить время на поиск: в Suse-Systems rsvg-convertвызывается пакет, содержащий rsvg-view.
Trendfischer
1
У меня это сработало и качество pdf такое же, как у svg. До этого он использовал imagemagick для конвертации в pdf, а качество было плохим, особенно для svg.
Пратик Сони
1
К сожалению, это не встраивает шрифты в macOS.
oarfish
79

Это работает на Ubuntu Lucid:

$ sudo apt-get install inkscape
$ inkscape t.svg --export-pdf=t.pdf

Вышеуказанный вызов Inkscape из командной строки работает даже в автономном режиме, без графического интерфейса пользователя ( DISPLAY=). Однако установка Inscape устанавливает множество зависимостей, включая X11.

Обратите внимание, что статус выхода Inskscape всегда равен 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
PTS
источник
2
К сожалению, это не работает на OS X. Тем не менее, хороший ответ.
Конрад Рудольф
3
ОП указал, что в Inkscape были ошибки рендеринга; это соответствует моему опыту.
Дилан Терстон
3
На OSX с использованием Homebrew вы можете установить Inkscape, используя brew install inkscapeэти дни. Получившийся /usr/local/bin/inkscapeу меня работал без необходимости запускать X11.app.
Алекс Шредер
2
Inkscape можно установить на OS X из dmgраспространяемого на его собственном веб-сайте, а затем вызывать из командной строки после создания двух символических ссылок: ln -s ~/Applications/Inkscape.app/Contents/Resources/bin/inkscape ~/bin/inkscapeи аналогично для inkscape-bin(при условии, что ~/binоно у вас $PATH).
Иоаннис Филиппидис
2
Вы можете использовать флаг -z(или --without-gui) с Inkscape, чтобы запускать его только в пакетном режиме (окно вообще не откроется).
Артефакт2
8

Я успешно использовал CairoSVG на OSX и Ubuntu.

pip install cairosvg
cairosvg in.svg -o out.pdf

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

SYK
источник
Есть даже привязки Python, которые вы можете использовать. К сожалению, я обнаружил, что этот метод довольно ограничен, то есть многие функции SVG не поддерживаются.
бодр
7

Я получаю хорошие результаты при печати из Inkscape (тоже 0.47) в PDF и при сохранении в формате PDF (но немного по-другому), но это может зависеть от имеющейся графики.

Альтернатива с более низким разрешением (я не пробовал переключатели для его улучшения)

 convert file.svgz file.pdf 

convertявляется частью ImageMagickпакета. Растеризатор это еще одна программа:

 rasterizer -m application/pdf file.svgz -d file.pdf 

Чтобы узнать, какие программы, которые обрабатывают svgs, установлены в вашей системе, просто попробуйте

 apropos -s 1 svg

Страница руководства для этих программ должна объяснить, является ли программа полезной для преобразования SVG в PDF.

неизвестный пользователь
источник
18
Спасибо вам за ваши предложения. К вашему сведению, convertэто не ответ на первоначальный вопрос, потому что convertрастеризация SVG в растровое изображение, и исходный вопрос искал решение, которое не делает этого.
оч
5

https://superuser.com/a/79064/19956 упоминает gsvg , часть GhostPDL.

Я пробовал gsvg ghostpdl-9.06 на Ubuntu Lucid, но он не удался для двух SVG, сгенерированных Inkscape. У одного SVG был текст, у другого была только векторная графика. Это также не удалось для простой графики без расширений Inkscape или пути к клипам. Поэтому я не считаю gsvg пригодным для использования конвертером SVG в PDF.

PTS
источник
3

На Mac OS (учитывая, что вы уже установили brew) я делаю:

$ brew install cairo libffi python3
$ pip3 install cairosvg

$ cairosvg -o blah.pdf ./blah.svg 

То же самое должно работать в Linux, но вместо этого с apt-get.

Адриэль младший
источник
1
Это работает и с выводом в формате pdf. В отличие от svg2pdfи rsvg-convert, это сохраняет шрифты.
oarfish
Спасибо, я поставил неправильное расширение. Я обновил пример.
Адриэль младший
Работал как шарм!
Майроп
1

Мне интересно, почему это не было упомянуто ранее, но я протестировал несколько различных конвертеров svg-> pdf и обнаружил, что лучшим из них является Headless Chrome . Это дает самые точные результаты для меня. До перехода на Chrome я пытался бороться с ошибками Inkscape, но многие из них слишком серьезны, и я ничего не могу с этим поделать (ошибки прозрачности, неправильные шрифты и т. Д.).

 chrome --headless --disable-gpu --print-to-pdf="output.pdf" "input.svg"

Требуются некоторые настройки для использования нестандартного размера PDF (A4 по умолчанию), но я смог установить нестандартный размер после некоторого поиска в Google и игры с атрибутами CSS и SVG (посмотрите этот ответ на stackoverflow )

Аваэль Кросс
источник
Добро пожаловать в Супер пользователя! Внешние ссылки могут сломаться или быть недоступными, в этом случае ваш ответ будет просто тизером. Даже если ссылки все еще работают, контент не может быть проиндексирован, чтобы помочь людям найти решение. Пожалуйста, включите необходимую информацию в свой ответ и используйте ссылку для атрибуции и дальнейшего чтения. Благодарю.
fixer1234
из WSL нужны дополнительные флагиchromium --no-sandbox --disable-setuid-sandbox --headless --disable-gpu --print-to-pdf=output.pdf input.svg
ticapix
0

Откройте файл 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
    

Это оно!

codeman48
источник