如何在Linux上将SVG转换为PDF


126

如何在Linux上将SVG和SVG(包含一些拉丁文字和一些简单的矢量图形)转换为PDF?

我在Ubuntu Lucid上尝试了Inkscape 0.47,但是它随机移动了一些子图形,并且使输出PDF中的行短了一些。因此它的输出是无用的,因为图形看起来完全不同。

我尝试在Google Chrome 16中打开SVG并将其打印为PDF,但是它扭曲了所有颜色,并且还删除了一些元素。(SVG在屏幕上看起来不错,但是在打印预览中已经很糟糕了,生成的PDF也很糟糕。)

我不想光栅化或渲染SVG。将SVG转换为位图图像,然后创建嵌入图像的PDF的解决方案不是我的问题的答案。(FYI Inscape 0.47渲染文本到PNG时是一种非常丑陋的方式,没有抗锯齿)。

我还有什么其他选择?


1
如果您只有几张要转换的图像,您可能会发现使用某些在线转换器会更容易。我尝试了CloudConvert,它用SVG的一半文件大小做得很好。
Frank Breitling

Answers:


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图像,这也可能会误导您。


4
我在这里看到很多依赖项:cairo,libgphoto,gtk3,libsane ...哦,好吧,如果它能完成工作……
ShiDoiSi 2013年

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。
Pratik Soni

1
不幸的是,这并未将字体嵌入到macOS中。
oarfish '18 -10-12

79

这适用于Ubuntu Lucid:

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

上面的命令行Inkscape调用甚至可以在没有GUI(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

2
不幸的是,这似乎在OS X上不起作用。
Konrad Rudolph

3
OP指出Inkscape存在渲染错误;这符合我的经验。
迪伦·瑟斯顿

3
在使用Homebrew的OSX上,您可以使用brew install inkscape这些日子来安装Inkscape 。结果/usr/local/bin/inkscape对我有用,而无需运行X11.app。
亚历克斯·施罗德(

2
Inkscape可以dmg从其自己的网站上的发行版安装在OS X 上,然后在创建两个符号链接后从命令行调用:ln -s ~/Applications/Inkscape.app/Contents/Resources/bin/inkscape ~/bin/inkscape和相似inkscape-bin(假设~/bin位于中$PATH)。
Ioannis Filippidis '16

2
您可以将-z(或--without-gui)标志与Inkscape一起使用,以仅在批处理模式下运行它(根本不会打开任何窗口)。
Artefact2

8

我已在OSX和Ubuntu上成功使用CairoSVG。

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

CairoSVG文档


您甚至可以使用python绑定。不幸的是,我发现此方法相当有限,即不支持许多svg功能。
bodo

7

从Inkscape(也是0.47)打印到PDF,并保存为PDF(但略有不同),我得到了很好的结果,但这可能取决于手头的图形。

分辨率较低的替代方案(我没有尝试过任何开关来对其进行改进)是

 convert file.svgz file.pdf 

convertImageMagick包装的一部分。光栅器是另一个程序:

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

要找出系统上已安装哪些处理svg的程序,只需尝试

 apropos -s 1 svg

这些程序的手册页应进行说明,该程序对于将svg转换为pdf很有用。


18
谢谢你的建议。仅供参考,convert这不是对原始问题的答案,因为convert将SVG光栅化为位图图像,并且原始问题正在寻找一种不这样做的解决方案。
pts 2012年

5

https://superuser.com/a/79064/19956提到了GhostPDL的gsvg。

我已经在Ubuntu Lucid上尝试了gsvg ghostpdl-9.06,但是对于Inkscape生成的两个SVG却失败了。一个SVG中有文本,另一个只有矢量图形。对于没有Inkscape扩展名或剪切路径的简单图形,它也失败了。因此,我不认为gsvg是可用的SVG到PDF转换器。


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 '18 -10-12

谢谢,我输入了错误的扩展名。我更新了示例。
Adriel Jr

像魅力一样工作!
Mayrop

1

我想知道为什么以前没有提到它,但是我测试了许多不同的svg-> pdf转换器,发现最好的是Headless Chrome。它为我产生最精确的结果。在改用Chrome之前,我曾尝试与Inkscape错误打交道,但其中许多错误太严重了,我无法做很多事情(透明错误,错误的字体等)。

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

需要使用自定义PDF大小进行一些调整(默认为A4),但在经过谷歌搜索并使用CSS和SVG属性后,我能够设置自定义大小(请在stackoverflow上查看此答案


欢迎来到超级用户!外部链接可能会断开或不可用,在这种情况下,您的答案将只是一个预告片。即使链接仍然有效,也无法为内容建立索引以帮助人们找到解决方案。请在回答中包括必要的信息,并使用链接进行归因和进一步阅读。谢谢。
fixer1234

从WSL,您需要一些额外的标志chromium --no-sandbox --disable-setuid-sandbox --headless --disable-gpu --print-to-pdf=output.pdf input.svg
ticapix

0

使用Image Viewer(也称为Eye of Gnome eog)打开svg文件,并将其打印为PDF文件(例如image.pdf),然后使用pdf2ps命令将该pdf转换为eps 。简单!

详细步骤:

  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
    

而已!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.