如何在 Linux 上将 SVG 转换为 PDF

pts*_*pts 151 png svg conversion

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

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

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

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

我还有什么其他选择?

pts*_*pts 161

rsvg-convert为我想要转换的 SVG 做了诀窍:

$ sudo apt-get install librsvg2-bin
$ rsvg-convert -f pdf -o t.pdf t.svg
Run Code Online (Sandbox Code Playgroud)

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

  • 这是我在这里看到的很多依赖项:cairo、libgphoto、gtk3、libsane ......哦,如果它可以完成工作...... (4认同)
  • @AyberkÖzgür 那是inkscape 的错——当你保存一个Inkscape 项目时,它会默认将它保存为SVG,但它保存的SVG 包含一堆非标准的inkscape 特定数据,这些数据经常会弄乱其他程序。您需要_export_ 作为SVG 而不仅仅是_Saving_ 作为SVG。 (4认同)
  • 可能会节省一些搜索时间:在 Suse-Systems 上,包含 `rsvg-convert` 的包称为 `rsvg-view`。 (2认同)
  • 它对我有用,并且 pdf 的质量与 svg 相同。在此之前使用 imagemagick 转换为 pdf,质量很差,尤其是 svg。 (2认同)
  • 在 macOS 中非常适合我。没有光栅化。`brew install librsvg` 然后使用 `rsvg-convert -f pdf -o t.pdf t.svg` 如上所述。 (2认同)

pts*_*pts 103

这适用于 Ubuntu Lucid:

$ sudo apt-get install inkscape
$ inkscape t.svg --export-pdf=t.pdf
Run Code Online (Sandbox Code Playgroud)

上面的命令行 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
Run Code Online (Sandbox Code Playgroud)

Inkscape 对于简化 SVG 也很有用:

$ DISPLAY= inkscape t.svg --export-plain-svg=t.plain.svg
Run Code Online (Sandbox Code Playgroud)

  • 它确实有效,只是 inkscape cli 当前使用选项 `--export-filename` https://inkscape.org/doc/inkscape-man.html (4认同)
  • OP 指出 Inkscape 存在渲染错误;这符合我的经验。 (3认同)
  • 在使用 Homebrew 的 OSX 上,这些天你可以使用 `brew installinkscape` 安装 Inkscape。生成的`/usr/local/bin/inkscape` 对我有用,无需运行 X11.app。 (3认同)
  • 不幸的是,这似乎不适用于 OS X。不过,很好的答案。 (2认同)
  • Inkscape 可以从它自己网站上分发的 `dmg` 安装在 OS X 上,然后在创建两个符号链接后从命令行调用:`ln -s ~/Applications/Inkscape.app/Contents/Resources/bin/inkscape ~/bin/inkscape` 和 `inkscape-bin` 类似(假设 `~/bin` 在你的 `$PATH` 中)。 (2认同)
  • 您可以在 Inkscape 中使用 `-z`(或 `--without-gui`)标志以仅在批处理模式下运行它(根本不会打开任何窗口)。 (2认同)

小智 15

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

pip install cairosvg
cairosvg in.svg -o out.pdf
Run Code Online (Sandbox Code Playgroud)

CairoSVG 文档

  • 您甚至可以使用 python 绑定。不幸的是,我发现这种方法相当有限,即不支持许多 svg 功能。 (2认同)

小智 13

我想知道为什么之前没有提到过,但我测试了一堆不同的 svg->pdf 转换器,发现最好的一个是Headless Chrome。它为我提供了最精确的结果。在切换到 Chrome 之前,我试图与 Inkscape 的错误作斗争,但其中许多错误太严重,我对此无能为力(透明度错误、错误字体等)。

chrome \
  --headless \
  --disable-gpu \
  --print-to-pdf-no-header \
  --print-to-pdf=output.pdf \
  input.svg
Run Code Online (Sandbox Code Playgroud)

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


use*_*own 9

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

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

 convert file.svgz file.pdf 
Run Code Online (Sandbox Code Playgroud)

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

 rasterizer -m application/pdf file.svgz -d file.pdf 
Run Code Online (Sandbox Code Playgroud)

要了解您的系统上安装了哪些处理 svgs 的程序,请尝试

 apropos -s 1 svg
Run Code Online (Sandbox Code Playgroud)

这些程序的联机帮助页应该解释一下,该程序是否有助于将 svg 转换为 pdf。

  • 谢谢你的建议。仅供参考,`convert` 不是原始问题的答案,因为 `convert` 将 SVG 栅格化为位图图像,而原始问题正在寻找不这样做的解决方案。 (22认同)

pts*_*pts 5

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

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


Adr*_* Jr 5

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

$ brew install cairo libffi python3
$ pip3 install cairosvg

$ cairosvg -o blah.pdf ./blah.svg 
Run Code Online (Sandbox Code Playgroud)

同样的情况应该可以在 Linux 上工作,但是需要使用 apt-get 来代替。


s.o*_*ene 5

@pts 的答案不适用于最新版本的 Inkscape(1.0 或更高版本)。要将 SVG 文件转换为 PDF:

inkscape --export-type=pdf my_file.svg
Run Code Online (Sandbox Code Playgroud)

这会将其导出到my_file.pdf.

如果您想为 PDF 文档指定不同的名称,请使用:

inkscape my_file.svg -o new_name.pdf
Run Code Online (Sandbox Code Playgroud)