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

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

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

我使用的命令是:

convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg

我猜测它很慢是因为它使用了 Ghostscript。 但在 Linux 上肯定有更快的方法来做到这一点。

有谁找到更好的解决方案吗?

答案1

直接使用 Ghostscript(而不是使用 ImageMagick 的convert命令,它会间接调用 Ghostscript)确实更快。而且它能让你更好地控制转换参数。尝试

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d.jpg \
   -dJPEGQ=95      \
   -r600x600       \
   -g4960x7016     \
   foo.pdf

在哪里

  • -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

甚至

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_default_a4.jpg \
   -sPAPERSIZE=a4 \
   foo.pdf

(提供 72dpi 分辨率,通常对于大多数屏幕和大多数 Web 应用程序来说已经足够好了)。

答案2

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

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

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

convert -list delegate

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

convert -list delegate | grep -i png

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

convert -list delegate | findstr /i png

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

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF

啊!它使用 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 则不能。等等。
      (因此,反方向的转换PS => PDF并不那么重要……)

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

答案3

poppler 包中的程序pdftoppm也能够创建 JPEG,对我来说,它的速度大约是gs上述方法的两倍:

pdftoppm -jpeg -r 300 foo.pdf foo.jpg

答案4

在我的经验中,多媒体PDF比 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 更快。

相关内容