我目前正在使用 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 到图像的转换,您首先应该了解两件事:
- 默认情况下,如果您不提供额外的参数,Ghostscript 将以 72dpi 的分辨率输出图像。这就是为什么有时人们会建议添加
-density 600
一个convert
参数,告诉 Ghostscript 使用 600 dpi 的分辨率输出图像。 - 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 更快。