想要在 Linux 上快速将 pdf 转换为 jpg

mat*_*001 11 pdf ghostscript imagemagick

我目前正在使用 ImageMagick 将 PDF 转换为 JPEG 光栅图像。它非常缓慢并且会占用大量内存。

我使用的命令是:

convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg
Run Code Online (Sandbox Code Playgroud)

我猜它很慢,因为它使用了 Ghostscript。 但是必须有一种更快的方法在 Linux 机器上做到这一点。

有没有人找到更好的解决方案?

Kur*_*fle 21

直接使用Ghostscript(而不是使用convert间接调用Ghostscript 的ImageMagick命令)确实更快。它使您可以更好地控制转换参数。尝试

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d.jpg \
   -dJPEGQ=95      \
   -r600x600       \
   -g4960x7016     \
   foo.pdf
Run Code Online (Sandbox Code Playgroud)

在哪里

  • -o: 确定输出路径+文件名(并保存使用-dBATCH -dNOPAUSE
  • -dJPEGQ: 将 JPEG 质量设置为 95%
  • -r: 将分辨率设置为 600dpi
  • -g: 将图像大小设置为 4960x7016px
  • -sDEVICE: 设置输出为 JPEG

此命令可能仍然会变慢并创建比预期更大的文件。对于更小的文件和更快的执行,试试这个(这可能接近你的convert命令行的输出质量):

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_200dpi_q80.jpg \
   -dJPEGQ=80      \
   -r200x200       \
   -g1653x2339     \
   foo.pdf
Run Code Online (Sandbox Code Playgroud)

甚至

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_default_a4.jpg \
   -sPAPERSIZE=a4 \
   foo.pdf
Run Code Online (Sandbox Code Playgroud)

(它提供 72dpi 的分辨率,通常足以满足大多数屏幕和大多数 Web 应用程序的需求)。


Kur*_*fle 10

顺便说一句,ImageMagick 慢得多的原因之一是它两次调用 Ghostscript。它不会一次性转换 PDF => PNG,而是使用两个不同的步骤:

  • 它首先使用 Ghostscript 进行PDF => PostScript转换;
  • 然后使用 Ghostscript 进行PostScript => PNG转换。

您可以通过键入了解 ImageMagick 的“委托”(ImageMagick 使用的外部程序,例如 Ghostscript)的详细设置

convert -list delegate
Run Code Online (Sandbox Code Playgroud)

(在我的系统上,这是一个包含 32 个不同命令的列表。)现在要查看哪些命令用于转换为 PNG,请使用以下命令:

convert -list delegate | grep -i png
Run Code Online (Sandbox Code Playgroud)

好的,这是针对 Linux 的。如果您使用的是 Windows,请尝试以下操作:

convert -list delegate | findstr /i png
Run Code Online (Sandbox Code Playgroud)

您会发现 IM 仅从 PS 或 EPS 输入生成 PNG。那么 IM 如何从您的 PDF 中获取 (E)PS?简单:

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF
Run Code Online (Sandbox Code Playgroud)

啊! 它使用 Ghostscript 进行 PDF => PS 转换,然后再次使用 Ghostscript 进行 PS => PNG 转换。有效,但如果您知道 Ghostscript 可以一次性完成 PDF => PNG,不是最有效的方法而且速度更快。而且质量要好得多。

关于 IM 通过 Ghostscript 委托处理 PDF 到图像的处理,您应该首先了解两件事:

  1. 默认情况下,如果不提供额外参数,Ghostscript 将输出 72dpi 分辨率的图像。这就是为什么有时这里的人建议添加-density 600一个convert参数,告诉 Ghostscript 为其图像输出使用 600 dpi 分辨率。
  2. IM 绕道两次调用 Ghostscript 以先转换PDF => PS然后再转换PS => PNG是一个真正的错误。因为你永远不会赢,而且在第一步很难保持质量,但经常会失去一些。原因:
    • PDF 可以处理透明胶片,而 PostScript 不能。
    • PDF 可以嵌入 TrueType 字体,而 PostScript 不能。等.pp
      (相反方向的转换PS => PDF,因此不是那么重要......)

这就是为什么我建议您直接使用 Ghostscript 将 PDF 一次性转换为 PNG(或 JPEG)。并使用Ghostscript 的最新版本 8.71(即将发布:9.00)...


小智 6

该方案pdftoppm从poppler的包也能创建JPEG文件,对我来说是约快两倍,使用gs上面所描述的:

pdftoppm -jpeg -r 300 foo.pdf foo.jpg
Run Code Online (Sandbox Code Playgroud)

  • 它并不比 gs 快 (2认同)

Jos*_*ica 6

根据我的经验,MuPDF比 Ghostscript 快得多。这是一个更新的项目,没有太多 gs 的繁琐。试试它是否适合您的用例!

mudraw -w 1024 -h 768 -r 200 -c rgb -o bar%d.png foo.pdf

如果您有较旧的 linux 发行版并从存储库安装 mupdf-tools,则mudraw可能仍会调用pdfdraw

然后,您必须使用例如 imagemagick 将 png 转换为 jpeg。但它仍然会比 Ghostscript 快。

  • 在我的测试中,MuPDF 的 PDF 到 PNG 转换比 Ghostscript 快 5-6 倍。谢谢你的解决! (2认同)