想要在Linux上快速将pdf转换为jpg [关闭]


11

我目前正在使用ImageMagick将PDF转换为JPEG光栅图像。速度很慢,并且会占用大量内存。

我使用的命令是:

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

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

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


多少时间,多少内存?
Zoredache

Answers:


18

convert实际上,直接使用Ghostscript(而不是使用ImageMagick的命令,该命令间接调用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应用程序来说已经足够了)。


1
你是对的。我真的不认为Imagemagick会成为瓶颈。但是我可能应该尝试过。也感谢伟大的例子!
mat3001 2010年

10

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

  • 它首先使用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)的原因。并使用最新版本的Ghostscript 8.71(即将发布:9.00)...


6

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

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

真是个好建议。正是由于这个答案,我才修复了一个严重的,导致应用崩溃的错误,我切换到pdftoppm -以前从来都不知道!
danmactough

您,先生,您值得为此奖牌:)
米兰·托多罗维奇

2
它并不比gs快
Ghilas BELHADJ

6

以我的经验,MuPDF比Ghostscript快很多。这是一个较新的项目,没有太多麻烦。尝试是否适合您的用例!

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

如果您使用的是较早的linux发行版,并从存储库中安装了mupdf-tools,则mudraw可能仍会被称为pdfdraw

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


2
在我的测试中,MuPDF的PDF到PNG的转换速度比Ghostscript快5-6倍。谢谢您的解决方案!
德米特里·阿金宁

1
这是非常有用的。Ghostscript将花费数分钟,而命令行则是轻而易举!非常感谢您引起我的注意!
likeitlikeit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.