How do I convert an SVG to a PDF on Linux

129

41

How do I convert and SVG (containing a a few words of latin text and some simple vector graphics) to a PDF on Linux?

I tried Inkscape 0.47 on Ubuntu Lucid, but it moves some sub-graphics randomly, and it makes some lines shorter in the output PDF. So it's output is useless, because the graphics looks completely different.

I tried opening the SVG in Google Chrome 16 and printing it to PDF, but it distorts all the colors, and it also removes some elements. (The SVG appears fine on screen, but it's already bad in the print preview and the generated PDF is also bad.)

I don't want to rasterize or render the SVG. A solution which converts the SVG to a bitmap image and then creates a PDF with the image embedded is not an answer to my question. (FYI Inscape 0.47 renders the text is a very ugly way, without antialiasing, when rendering to PNG.)

What other options do I have?

pts

Posted 2012-01-22T12:17:36.497

Reputation: 5 441

1

If you just have a few images to convert you might find it easier to use some of the online converters. I tried CloudConvert and it did a very good job with half the file size of the SVG.

– Frank Breitling – 2017-06-13T17:28:22.220

Answers

138

rsvg-convert did the trick for the SVG I wanted to convert:

$ sudo apt-get install librsvg2-bin
$ rsvg-convert -f pdf -o t.pdf t.svg

rsvg-convert -f pdf doesn't rasterize the SVG, and it embeds and subsets fonts (at least it has embedded the used characters of the Arial font). Sometimes font embedding fails (e.g. for the LMRoman17 font), and the whole font file gets copied to the generated PDF.

Dependencies on 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

By default, libcairo needs libX11, so rsvg-convert may be hard to install to a headless system.

Note: The man page of rsvg-convert states that the tool always rasterizes, but this isn't true. The manual is simply obsolete. Sometimes your svg generating tool can partially rasterize the svg image, which can also mislead you.

pts

Posted 2012-01-22T12:17:36.497

Reputation: 5 441

NOT TRUE! First line of "man rsvg-convert": "turn SVG files into raster images.". Misleading, it DOES rasterization, -1! – peterh - Reinstate Monica – 2014-07-09T11:03:08.537

@PeterHorvath: Thanks for the feedback. I've changed the sentence to: rsvg-convert -f pdf doesn't rasterize the SVG. This is true now. Please reconsider your downvote. The first line of the man page (turn SVG files into raster images) is inaccurate, it doesn't apply to rsvg-convert -f pdf. – pts – 2014-07-09T21:30:47.877

I just tried it, and I thought it would rasterize the SVG: A very fine dotpattern got turned into something blurry. But it turns out a problem with my PDF viewer... – Joachim Breitner – 2014-11-07T22:03:45.067

rsvg-convert mangled my document prepared with inkscape beyond recognition. – Ayberk Özgür – 2015-08-21T14:22:15.827

rsvg-convert worked fine, can confirm it doesn't rasterize. But ALL text in the svg is GONE in the pdf... – Quandary – 2015-10-21T08:21:34.470

4@AyberkÖzgür That's inkscape's fault - when you save an Inkscape project, it will by default save it as a SVG, but the SVG it saves includes a bunch of nonstandard inkscape-specific data that can frequently mess up other programs. You need to export as an SVG rather than just saving as a SVG. – AJMansfield – 2015-11-07T23:18:12.940

2Might save some time searching: On Suse-Systems the package containing rsvg-convert is called rsvg-view. – Trendfischer – 2016-01-22T16:14:43.067

1It worked for me and the quality of pdf is same as svg. Before this was using imagemagick to convert to pdf and the quality was poor especially for svg. – Pratik Soni – 2016-05-26T09:08:24.263

On my Mac the output of rsvg-convert is has a bunch of weird artifacts. – Alper – 2016-12-13T11:37:58.053

It resizes the PDF. I wanted it to be the same size of the SVG – xxx--- – 2017-06-03T11:14:36.813

Worked perfectly for me in macOS. No rasterisation. brew install librsvg then used rsvg-convert -f pdf -o t.pdf t.svg as above. – Benjamin R – 2018-03-20T04:45:07.977

1Unfortunately, this does not embed the fonts on macOS. – oarfish – 2018-10-12T14:26:23.223

I used "urpmi librsvg" under Mageia Linux. @pts Please consider updating your answer as numerous distros use a different name for this library: https://pkgs.org/download/librsvg I'm going to upvote your answer ;) Thanks.

– gouessej – 2019-11-30T10:59:52.047

4That's a lot of dependencies I'm seeing here: cairo, libgphoto, gtk3, libsane...Oh well, if it does the job... – ShiDoiSi – 2013-04-16T15:47:28.787

Will this convert to a cmyk color space? – justingordon – 2014-02-23T04:18:23.187

justingordon: I don't know, you can ask this as a separate StackOverflow question. – pts – 2014-02-23T04:53:06.857

89

This works on Ubuntu Lucid:

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

The command-line Inkscape invocation above works even in headless mode, without a GUI (DISPLAY=). However, installing Inscape installs lots of dependencies, including X11.

Please note that the exit status of Inskscape is always 0, even if an error occurs -- so watch out for its stderr.

There is also inkscape --shell, suitable for converting many documents in a batch. This avoids the slow Inkscape startup time for each file:

$ (echo t.svg --export-pdf=t.pdf;
   echo u.svg --export-pdf=u.pdf) |
  DISPLAY= inkscape --shell

Inkscape is also useful for simplifying an SVG:

$ DISPLAY= inkscape t.svg --export-plain-svg=t.plain.svg

pts

Posted 2012-01-22T12:17:36.497

Reputation: 5 441

3The OP specified that Inkscape had rendering bugs; this matches my experience. – Dylan Thurston – 2014-10-22T17:17:13.473

3On OSX using Homebrew, you can install Inkscape using brew install inkscape these days. The resulting /usr/local/bin/inkscape worked for me without having to run X11.app. – Alex Schröder – 2015-12-31T22:27:32.013

2Inkscape can be installed on OS X from the dmg distributed at its own website, and then called from the command line after creating two symbolic links: ln -s ~/Applications/Inkscape.app/Contents/Resources/bin/inkscape ~/bin/inkscape and similarly for inkscape-bin (assuming ~/bin is in your $PATH). – Ioannis Filippidis – 2016-12-21T13:08:03.603

2You can use the -z (or --without-gui) flag with Inkscape to run it in batch mode only (no window will open at all). – Artefact2 – 2017-01-06T18:48:38.423

For macOS: brew cask install xquartz then brew cask install inkscape. – Jonny – 2018-06-29T09:06:23.650

I just found out that inkscape cannot open SVGs exported from Figma. – Jonny – 2018-06-29T09:12:43.837

Seems it rasterizes vector paths – Pavel – 2019-10-21T11:01:44.690

2Unfortunately this doesn’t seem to work on OS X. Still, nice answer. – Konrad Rudolph – 2013-11-26T23:12:12.873

10

I have used CairoSVG successfully on OSX and Ubuntu.

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

CairoSVG Documentation

SYK

Posted 2012-01-22T12:17:36.497

Reputation: 200

There are even python-bindings you can use. Unfortunately I found that this method is rather limited, i.e. a lot of svg features are not supported. – bodo – 2017-03-12T10:09:06.090

7

I get good results from printing from Inkscape (0.47 too) to PDF, and for saving as PDF (but slightly different), but this might depend on the graphic at hand.

An alternative with lower resolution (I did not try any switches to improve it) is

 convert file.svgz file.pdf 

convert is part of the ImageMagick package. Rasterizer is another program:

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

To find out, which programs which handle svgs are installed on your system, just try

 apropos -s 1 svg

The manpage for these programs should explain, wether the program is useful for converting the svg to pdf.

user unknown

Posted 2012-01-22T12:17:36.497

Reputation: 1 623

18Thank you for your suggestions. FYI convert is not an answer to the original question, because convert rasterizes the SVG to a bitmap image, and the original question was looking for a solution which doesn't do that. – pts – 2012-01-22T20:15:58.907

5

https://superuser.com/a/79064/19956 mentions gsvg, part of GhostPDL.

I've tried gsvg ghostpdl-9.06 on Ubuntu Lucid, but it failed for two SVGs generated by Inkscape. One SVG had text in it, the other had only vector graphics. It also failed for simple graphics without Inkscape extensions or clip-path. So I don't consider gsvg a usable SVG-to-PDF converter.

pts

Posted 2012-01-22T12:17:36.497

Reputation: 5 441

3

On Mac OS (considering that you already have brew installed) I do:

$ brew install cairo libffi python3
$ pip3 install cairosvg

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

Same should work on Linux, but with apt-get instead.

Adriel Jr

Posted 2012-01-22T12:17:36.497

Reputation: 131

1This works with pdf output as well. In contrast to svg2pdf and rsvg-convert, this preserves the fonts. – oarfish – 2018-10-12T14:28:28.603

Thanks, I put the wrong extension. I updated the example. – Adriel Jr – 2018-10-14T02:34:48.393

Worked like a charm! – mayrop – 2019-05-29T23:07:37.140

1

I'm wondering why it hasn't been mentioned before, but I tested a bunch of different svg->pdf converters and found that the best one is Headless Chrome. It produces the most precise results for me. Before switching to Chrome, I was trying to fight with Inkscape bugs, but many of them are too serious and I can't do much about it (transparency bugs, wrong fonts, etc).

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

It needs some tweaks to use custom PDF size(A4 is default), but I was able to set custom size after some googling and playing with CSS and SVG attributes (check out this answer on stackoverflow)

Avael Kross

Posted 2012-01-22T12:17:36.497

Reputation: 111

Welcome to Super User! External links can break or be unavailable, in which case your answer would be just a teaser. Even while links still work, the content can't be indexed to help people find the solution. Please include the essential information within your answer and use the link for attribution and further reading. Thanks. – fixer1234 – 2019-07-02T03:47:22.543

from WSL, you need some extra flags chromium --no-sandbox --disable-setuid-sandbox --headless --disable-gpu --print-to-pdf=output.pdf input.svg – ticapix – 2019-07-20T20:31:28.027

0

Open the svg file with Image Viewer (Also called Eye of Gnome eog) and print it to a PDF file (say image.pdf) and convert that pdf to eps using pdf2ps command. Simple!

Elaborated steps:

  1. Install Image Viewer if not yet done (highly unlikely step if you use gnome)

    sudo apt-get install eog
    
  2. Open svg file with eog and print it to image.pdf file.

  3. (Optional) Remove surrounding whitespace from the pdf file:

    pdfcrop image.pdf
    

    This will generate image-crop.pdf with surrounding whitespace removed.

  4. Convert cropped pdf to eps (use image.pdf directly if you didn't crop the pdf)

    pdf2ps image-crop.pdf image.eps
    

Thats it!

codeman48

Posted 2012-01-22T12:17:36.497

Reputation: 101