如何在Linux命令行中将PDF转换为JPG?

75

在Linux命令行中,快速可靠地将PDF转换为单个JPEG的方法是什么?


如果您从源代码编译xpdf,它将附带一些小工具,例如pdftotext、pdftojpeg和podftohtml。它们可以与某些Linux发行版一起分发,但在我使用的Debian中似乎没有它们。 - Alan Corey
抱歉,它们都在poppler-utils中。包括pdfdetach,pdffonts,pdfimages,pdfinfo,pdfseparate,pdfsig,pdftocairo,pdftohtml,pdftoppm,pdftops,pdftotext和pdfunite。或者从源代码构建xpdf,我非常确定可以。 - Alan Corey
5
投票重新开放。我认为这不是关于“一般计算硬件和软件”的问题,而是关于bash CLI编程的问题。 - Gabriel Staples
3
就像@GabrielStaples所说的那样。我来这里就是为了找到这个答案,而且我不知道其他地方可以寻找这个答案。 - Mike Maxwell
你觉得用 https://unix.stackexchange.com/ 这个网站来问这个问题怎么样? - undefined
4个回答

117
在过去的5年里,我无论如何都无法让imagemagick稳定地工作(如果有的话),我不知道为什么人们一再推荐它。今天我刚刚谷歌了如何将PDF转换为JPEG的方法,找到了这个答案,并尝试了convert命令,但对我来说根本不起作用: 错误的命令(对我无效):
# BROKEN cmd
$ convert in.pdf out.jpg
convert-im6.q16: not authorized `in.pdf' @ error/constitute.c/ReadImage/412.
convert-im6.q16: no images defined `out.jpg' @ error/convert.c/ConvertImageCommand/3258.

(2022年2月24日更新:这里是ImageMagick的修复方法,所以convert将正常工作。另请参阅我在这里的评论,以及我的评论在这个答案下面。然而,我仍然更喜欢下面的pdftoppm。)
然后,我记起还有另一个我使用过并写过的工具,所以我在谷歌上搜索了“linux convert pdf to jpg Gabriel Staples”,点击了第一个链接,并向下滚动找到了我的答案。以下是对我来说完美运行的命令格式: 好的命令-请使用这个:
# GOOD cmd
pdftoppm -jpeg -r 300 input.pdf output

注意:在Linux Ubuntu上,您可能需要执行sudo apt update && sudo apt install poppler-utils来安装pdftoppm谢谢,@Reynadan

-jpeg将输出图像格式设置为JPG,-r 300将输出图像分辨率设置为300 DPI,并且单词output将作为所有图像页面的前缀,它们将被编号并放置在您当前工作目录中。然而,我个人认为更好的方式是首先使用mkdir -p images创建一个名为"images"的目录,然后将输出设置为images/pg,这样所有输出图像将整洁地放置在您刚创建的images目录中,每个图像的文件前缀为pg加上相应的数字。

因此,这是我最喜欢的命令:

  • [每页产生约1MB大小的文件] 输出为.jpg格式,分辨率为300 DPI
  • mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  • [每页产生约2MB大小的文件] 输出为.jpg格式,以最高质量(最少压缩)300 DPI
  • mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg
    
  • 如果需要更高的分辨率,可以尝试600 DPI:
  • mkdir -p images && pdftoppm -jpeg -r 600 mypdf.pdf images/pg
    
  • ...或者1200 DPI:
  • mkdir -p images && pdftoppm -jpeg -r 1200 mypdf.pdf images/pg
    

    请参考下面的参考资料,了解更多详细信息和选项。
    参考资料:
    1. [我的回答] 将PDF转换为高分辨率图像 2. [我的回答] https://askubuntu.com/questions/150100/extracting-embedded-images-from-a-pdf/1187844#1187844 关键词:ubuntu linux convert pdf to images; pdf to jpeg; ptdf to tiff; pdf2images; pdf2tiff; pdftoppm; pdftoimages; pdftotiff; pdftopng; pdf2png

    1
    @SteveChavez -singlefile,根据文档说明,“只会写入第一页且不添加数字”。这意味着,如果您想生成所有页面垂直堆叠(或水平缝合)的长图像,则此选项无法达成您的目标。 - brianjcohen
    1
    ImageMagick在Ubuntu 20.04上对我不起作用。这个方法非常有效! - MIkee
    1
    @matanster,另外请注意,我在另一个答案之后3年才写了我的答案。那个答案使用的convert命令我认为是有问题的,但它被接受为正确答案。我觉得我需要提供理由,解释为什么我要给一个已经有了被接受和高赞的答案的3年老问题添加一个新的答案。直到最近一个月左右,我的答案才终于超过了原始答案的投票数。 - Gabriel Staples
    1
    pdftoppm 对我很有帮助。convert 也可以,但生成的 JPEG 图片非常模糊。使用 pdftoppm 的结果要好得多。因此,即使您没有 convert 不起作用的问题,我仍然建议使用 pdftoppm - Andyc
    1
    你需要执行 sudo apt install poppler-utils 命令来使用 pdftoppm 命令。 - Reynadan
    显示剩余7条评论

    80

    您可以尝试使用ImageMagick的convert工具。

    在Ubuntu上,您可以使用以下命令安装它:

    $ sudo apt-get install imagemagick
    

    像这样使用convert

    $ convert input.pdf output.jpg
    # For good quality use these parameters
    $ convert -density 300 -quality 100 in.pdf out.jpg
    

    34
    如果你遇到了类似于“convert: not authorized 'filename.pdf' @ error/constitute.c/ReadImage/412.”的错误,那么你需要修改“/etc/ImageMagick-6/policy.xml”文件,或者暂时将其重命名。 - mivk
    5
    对我来说,这很遗憾无法起作用。请参考“pdftoppm”答案获取更有效的解决方案。 - Steve Chavez
    11
    为了得到高分辨率的JPG图片而不是低分辨率的,我需要运行以下命令:convert -density 300 -quality 100 in.pdf out.jpg - Matthias Braun
    4
    在我的 policy.xml 文件中,我需要将 <policy domain="coder" rights="none" pattern="PDF" /> 这行注释掉。但通常我遇到这个错误时更倾向于暂时重命名该文件。 - mivk
    3
    那是何等的怪物?为什么首先就有“政策”?这些愚蠢的规则是在保护什么? - 400 the Cat
    显示剩余4条评论

    18

    libvips可以快速地将PDF转换为JPEG。它随附于大多数Linux发行版中,在macOS上的homebrew中也有,您还可以从libvips网站下载Windows二进制文件。

    这将在默认DPI(72)下将PDF渲染为JPG:

    vips copy somefile.pdf somefile.jpg
    

    您可以使用dpi选项设置其他渲染分辨率,例如:

    vips copy somefile.pdf[dpi=600] somefile.jpg
    

    您可以像这样选择页面:

    vips copy somefile.pdf[dpi=600,page=12] somefile.jpg
    

    或者按以下方式从第三页开始呈现五页:

    vips copy somefile.pdf[dpi=600,page=3,n=5] somefile.jpg
    

    pdfload文档包含所有选项。

    使用此基准图像,我看到:

    $ /usr/bin/time -f %M:%e convert -density 300 r8.pdf[3] x.jpg
    276220:2.17
    $ /usr/bin/time -f %M:%e pdftoppm -jpeg -r 300 -f 3 -l 3 r8.pdf x.jpg
    91160:1.24
    $ /usr/bin/time -f %M:%e vips copy r8.pdf[page=3,dpi=300] x.jpg
    149572:0.53
    

    所以至少在这个测试中,libvips大约快了4倍且需要一半的内存。


    比pdf2ppm、mupdf和ghostscript快得多! - sam

    12

    看起来使用 imagemagick 进行转换效果不错:

    convert file.pdf test.jpg 
    

    如果有多个文件生成:

    convert test-0.jpg -append test-1.jpg ... -append one.jpg
    

    生成一个单一文件,其中所有页面都被连接在一起。

    1
    convert 关键字用单破折号指定,例如 -append test-1.jpg 等。 - Stefan van der Walt

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接