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

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

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

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

我还有什么其他选择?

评论

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

#1 楼

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
librsvg-2.so.2
libpthread.so.0
libc.so.6

默认情况下,libcairo需要libX11,因此rsvg-convert可能很难安装到无头系统。

注意:
rsvg-convert的手册页指出该工具总是栅格化,但这不是事实。该手册已经过时了。有时您的svg生成工具可以部分光栅化svg图像,这也会误导您。

评论


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

– Volker Stolz
13年4月16日在15:47

@AyberkÖzgür这是inkscape的错-当您保存Inkscape项目时,默认情况下会将其另存为SVG,但是它保存的SVG包括一堆非标准的inkscape特定数据,这些数据经常会弄乱其他程序。您需要导出为SVG,而不仅仅是保存为SVG。

– AJMansfield
15年11月7日在23:18

可能会节省一些搜索时间:在Suse-Systems上,包含rsvg-convert的软件包称为rsvg-view。

–Trendfischer
16年1月22日在16:14

它为我工作,并且pdf的质量与svg相同。在此之前使用imagemagick转换为pdf,质量很差,尤其是对于svg。

– Pratik Soni
16年5月26日在9:08

在macOS中对我来说完美工作。无栅格化。 brew安装librsvg,然后如上所述使用rsvg-convert -f pdf -o t.pdf t.svg。

–本杰明·R
18年3月20日在4:45

#2 楼

这适用于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


评论


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

–康拉德·鲁道夫(Konrad Rudolph)
13年11月26日在23:12

OP指出Inkscape有渲染错误;这符合我的经验。

–迪伦·瑟斯顿(Dylan Thurston)
14-10-22在17:17

在使用Homebrew的OSX上,这些天可以使用brew install inkscape安装Inkscape。生成的/ usr / local / bin / inkscape对我有用,而无需运行X11.app。

– AlexSchröder
15年12月31日在22:27

Inkscape可以通过在其自己的网站上分发的dmg安装在OS X上,然后在创建两个符号链接后从命令行调用:ln -s〜/ Applications / Inkscape.app / Contents / Resources / bin / inkscape〜/ bin / inkscape以及inkscape-bin的类似方法(假设〜/ bin在您的$ PATH中)。

–艾奥尼斯·菲利皮迪斯(Ioannis Filippidis)
16年12月21日在13:08

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

– Artefact2
17年1月6日在18:48

#3 楼

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

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


CairoSVG文档

评论


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

– bodo
17年3月12日在10:09

#4 楼

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

分辨率较低(我没有尝试过任何开关来改善它)的另一种选择是
 convert file.svgz file.pdf 


convertImageMagick软件包的一部分。
Rasterizer是另一个程序:

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


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

 apropos -s 1 svg


应该解释这些程序的手册,该程序对于将svg转换为pdf很有用。

评论


谢谢你的建议。 FYI转换不是对原始问题的答案,因为转换将SVG光栅化为位图图像,并且原始问题正在寻找一种不这样做的解决方案。

–点
2012年1月22日20:15

#5 楼

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

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

#6 楼

在Mac OS上(考虑到您已经安装了brew),我可以这样做:

$ brew install cairo libffi python3
$ pip3 install cairosvg

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


在Linux上也可以使用,但使用apt-get可以。

评论


这也适用于pdf输出。与svg2pdf和rsvg-convert相比,这保留了字体。

– ar鱼
18-10-12在14:28

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

–小Adriel
18-10-14在2:34

像魅力一样工作!

– Mayrop
19年5月29日在23:07

#7 楼

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

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


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

评论


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

–fixer1234
19年7月2日,下午3:47

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

– ticapix
19年7月20日在20:31



使用自定义字体渲染比其他解决方案更好,太棒了!

–themadmax
20年6月1日在13:49

对于Red Hat衍生产品(此处为Fedora 32),请在命令行上使用铬浏览器...

–埃里希·库斯特(Erich Kuester)
20年8月27日在9:55

您为什么不只共享自定义尺寸的解决方案?如何修改命令以传递尺寸?您所链接的答案没有告诉您...

–托马斯
20-10-26在10:20



#8 楼

很棒的解决方案,Avael Kross(https://superuser.com/users/1057244/avael-kross)!!无头Chrome十分适合我。

我自动执行了从输出PDF删除页眉和页脚的过程,并使之适合SVG的大小。
我将Shell脚本上传到了以下要点。

svg2pdf.bash:
https://gist.github.com/s417-lama/84bf66de1096c4587e8187092fb41684

用法:

$ ./svg2pdf.bash input.svg output.pdf


#9 楼

显示SVG 1.1时,此处提到的大多数工具都存在问题。因此,我使用了以下解决方法:

大多数浏览器似乎是SV​​G的最佳查看器。 Firefox和Chrome完全支持SVG 1.1。我只是在浏览器中显示了SVG。
然后将页面打印为PDF,同时:

将图像适合页面
将所有页面边框设置为0
保留所有页眉和页脚为空


由于您不能与预定义的页面大小不同,因此之后我使用pdfcrop来获得具有SVG确切尺寸的PDF。


#10 楼

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

详细步骤:




如果尚未安装,请安装Image Viewer(如果使用gnome,则不太可能执行此步骤)

sudo apt-get install eog


eog打开svg文件并将其打印到image.pdf文件。

(可选)从pdf文件中删除周围的空格:

pdfcrop image.pdf


这将生成image-crop.pdf,并且周围的空格已删除。


将裁剪的pdf转换为eps(如果不裁剪pdf,则直接使用image.pdf

pdf2ps image-crop.pdf image.eps



就这样!