如何将PDF转换为图片?

我需要将PDF页面转换为图像。我的文件中有一个带有一些文本的背景图像,当我将其保存为图像时,只保存了背景图像。
是否有可用于将整个页面转换为图像的软件?

显然,在 Inkscape 上也是可能的:http://stackoverflow.com/a/15484727/32453 - rogerdpack
2我没有10个声望来发布回答,所以这里有另一种方法,使用MuPDF。 mutool convert -o file.png file.pdf - user3413723
3使用bash命令: pdftocairo file.pdf -png - Anthony Ebert
PDFBox也做得很好。https://pdfbox.apache.org/ - Barna Kovacs
你可以使用安全快速的PDF转JPG转换器https://convertpdftojpg.net。 - Eslam Sameh Ahmed
使用GIMP是一种很好的方法,可以在不使用命令行的情况下完成这个任务。 - Flimm
13个回答

你可以使用poppler-utils软件包中的pdftoppm命令将PDF转换为PNG格式。
pdftoppm input.pdf outputname -png

这将使用格式outputname-01.png输出PDF中的每一页,其中01是页面的索引。

转换单个页面或PDF的一系列页面

pdftoppm input.pdf outputname -png -f {page} -singlefile

{page}更改为页码。索引从1开始,所以-f 1表示第一页。
如果您想处理一系列页面,还可以为标志-l(最后一页)指定一个数字,例如-f 1 -l 30表示从第1页到第30页。
请再次注意,.png将自动添加到outputname,因此无需包含扩展名。另外,-singlefile会删除上述提到的-01后缀,因为输出已知只有一个文件。
指定转换图像的分辨率
该命令的默认分辨率为150 DPI。增加分辨率将导致文件大小变大并且细节更多。
要增加转换后PDF的分辨率,请添加选项-rx {resolution}-ry {resolution}。例如:
pdftoppm input.pdf outputname -png -rx 300 -ry 300

34非常感谢。质量比使用imagemagick或graphicsmagick好得多! - dAnjou
13pdftoppm比convert快得多。 - zuo
只需一个文件夹中的一个PDF,不需要指定PDF文件的具体名称:pdftoppm -png *.pdf 前缀 - user47206
7这真的比ImageMagick好多了。在我的情况下,ImageMagick实际上以一种意想不到的方式改变了颜色! - NoBackingDown
34这很好!但是当你想要将x和y分辨率设置为相同值时,写-r 300比单独指定x和y分辨率要简单一些。 - mlc
1太棒了,尽管这是在askubuntu部分,但我很高兴发现它也适用于OS X! - RocketNuts
我们如何将它们重新放回PDF?使用这个工具,来完成循环。 - Ray Foss
1pdftohtml(列在pdftoppm手册的末尾)对我的使用情况更有效;谢谢你的提示 :-) - Abbafei
另外:pdftocairo -png page.pdf page.png - turdus-merula
3运行良好。要获取此软件,您可以在macOS上使用brew install poppler - Pavel Vlasov
5我在使用pdftoppm时比使用imagemagick取得了更多的成功。 - Michael Hays
1有没有办法强制使用最高设置,即无压缩? - William
1我用Python的Matplotlib或ROOT制作了PDF图表。当我使用pdftoppm或convert模块将图表转换为PNG格式时,结果会放置在右上角,并留下一个宽阔的白色空间。我通过添加“-cropbox”选项解决了这个问题。 - HD189733b
要将其转换为CBZ格式(例如,用于在像Gnome Books这样的电子书阅读器中阅读),您可以链接命令并使用pdftoppm myfile.pdf myfile -png && zip myfile.cbz myfile-*.png; rm myfile-*.png。这将在与"myfile.pdf"相同的目录中生成一个名为"myfile.cbz"的文件。 - IBBoard
或者,为了更方便处理多个PDF文件,可以使用FILE=无扩展名的文件名; pdftoppm $FILE.pdf $FILE -png && zip $FILE.cbz $FILE-*.png; rm $FILE-*.png。这将在与"无扩展名的文件名.pdf"相同的目录中生成一个"无扩展名的文件名.cbz"文件。 - IBBoard
"pdftoppm" 功能非常强大,支持多种输出图像格式,包括 PPM、PNG、JPEG 和 TIFF。您还可以通过 -r 300 等来指定分辨率,以及 JPEG 压缩(质量)级别。请参阅我的完整答案和示例:https://askubuntu.com/questions/150100/extracting-embedded-images-from-a-pdf/1187844#1187844 - Gabriel Staples
我一开始跳过了这个答案,因为我不想安装额外的软件 - 结果发现我已经在Ubuntu 18.04上安装了pdftoppm - Zoltán
1有没有办法在PNG中设置透明背景?使用pdftoppm将背景设置为白色,并使用convert将其设置为透明,但是即使我在policy.xml中增加内存限制,convert在处理大型PDF时仍然存在问题。 - Roah
有没有办法添加密码? - Manohar
看起来cairoppm更容易出现bug。 - Yai0Phah
使用-cropbox选项导出的页面与我预期的一样,如果您不喜欢初始结果,请尝试使用此选项。 - Denilson Sá Maia
附注:在Ubuntu上安装软件的方法是:先运行sudo apt update,然后运行sudo apt install poppler-utils - Avatar
1如果您想调整生成的 PNG 的大小,可以使用例如 -scale-to 300。这将生成一个最大高度为 300 像素的 PNG 图像。参数 -r 表示“图像的粗糙程度”,而 -scale-to 则表示图像的整体尺寸(一侧)。详见链接:https://askubuntu.com/a/1179820/238253 - Avatar
请参阅pdftoppm文档/手册:https://www.systutorials.com/docs/linux/man/1-pdftoppm/ - Avatar
谢谢!这样保留了字体,不像Inkscape那样。然后我使用convert -trim来去除空白,因为-cropbox对我不起作用。 - SurpriseDog
太棒了,考虑到pdftoppm已经默认安装在Ubuntu 23.04上! - Dan Doe

  1. 安装imagemagick

  2. 在PDF所在的终端中执行以下命令:

    • 转换整个文档:

      convert -density 150 input.pdf -quality 90 output.png
      
    • 转换单独一页:

      convert -density 150 input.pdf[666] -quality 90 output.png
      

具体来说:

  • 可以选择PNG、JPG或(几乎)任何其他图像格式。

  • -density xxx 将DPI设置为 xxx(常见的是150和300)。

  • -quality xxx 将PNG、JPG和MIFF文件格式的压缩设置为 xxx(100表示无压缩)。

  • [666] 仅将第667页转换为PNG(从零开始编号,因此[0]是第一页)。

  • 所有其他选项(如修剪、灰度等)都可以在Image Magic的网站上查看。


2答案本身是有效的,但分辨率非常低。因此,目前不是一个有用的答案。也许如果转换具有可以指定的一些参数,情况会有所改变。 - Elijah Lynn
52这个答案的质量要高得多 http://askubuntu.com/a/50180/11929 - Elijah Lynn
8你可以通过添加“-density 300”参数来改变密度。 - Mokus
你回答中的图片无法显示。或许你应该更新它。 - Petr R.
5那么有人可以确认一下,指定密度是否使得它与其他答案一样好呢?另外作为一个提示给追随者们,ImageMagick调用"ghostscript"来实际进行从pdf到png的转换,例如:gs -q NOPROMPT ...-sDEVICE=pngalpha -r150x150 -sOutputFile=/var/tmp/Yf%d -f/var/tmp/L -f/var/tmp/Fic1 如果你收到了convert: no images defined output.png这样的消息,那意味着你没有安装ghostscript... - rogerdpack
1这对我来说很好用,使用“-density 300”参数。 - mghaoui
使用-density 500 -quality 100,与_pdftoppm_相比,我仍然得到了较差的图像质量。 - frozen-flame
将图像转换回PDF的命令是:convert output-0.png output-1.png output-2.png output.pdf。详情请参考:https://itsfoss.com/convert-multiple-images-pdf-ubuntu-1304/。 - Gabriel Staples
1我遇到了这个错误 convert-im6.q16: not authorized 'test.pdf' @ error/constitute.c/ReadImage/412. - Joschua
2我遇到了一个问题:convert-im6.q16: no images defined 'output.png' @ error/convert.c/ConvertImageCommand/3258。我知道@rogerdpack已经提到过这个问题,但是我已经安装了Ghostscript,我可以使用gs - hsandt
10解析PDF在ImageMagick中已被禁用 - https://bugs.archlinux.org/task/59778 - 可以通过手动编辑/etc/ImageMagick-7/policy.xml文件并从<policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" />中移除PDF来启用。 - Jezor
2你可能想要添加-background white -alpha off来去除透明度。 - Martin Thoma
我发现GIMP在转换质量方面比imagemagick要高得多(截至目前在Ubuntu 19.04中打包的各自版本)。 - durette
1@ElijahLynn 我已经更改了被接受的答案。 - Deependra Solanky
很遗憾,我无法找到一种实用、易于跟随的例行程序来使用我最喜欢的工具“convert”。我同意@ElijahLynn的观点,并指向解决方案http://askubuntu.com/a/50180/11929。 - somethis
我遇到一个错误:"convert-im6.q16:尝试执行安全策略不允许的操作'PDF'"。我认为 ImageMagick 不再支持 PDF 解析了。 - Flimm
@Flimm,看一下上面Jezor的评论。 - undefined

据我所知,GIMP可以使用PDF文件,即将其转换为图像。因此,如果您想立即编辑图像,GIMP是您的好朋友。

GIMP确实可以打开PDF文件,每一页作为一层。选择“导出为”似乎只保存当前图层,但是在导出后你可以轻松删除该图层并再次运行“导出为”。 - Dan Dascalescu
截至目前在Ubuntu 19.04中打包的各自版本,我发现GIMP比imagemagick产生更高质量的转换。 - durette

当前被接受的答案能够完成任务,但生成的输出文件较大且质量有所损失。

这个回答中提供的方法在这里生成的输出文件与输入文件大小相当,并且不会有质量损失。

TLDR - 使用pdfimages命令: pdfimages -j 输入.pdf 输出

引用链接中的回答:

It's not clear what you mean by "quality loss". That could mean a lot of different things. Could you post some samples to illustrate? Perhaps cut the same section out of the poor quality and good quality versions (as a PNG to avoid further quality loss).

Perhaps you need to use -density to do the conversion at a higher dpi:

convert -density 300 file.pdf page_%04d.jpg

(You can prepend -units PixelsPerInch or -units PixelsPerCentimeter if necessary. My copy defaults to ppi.)

Update: As you pointed out, gscan2pdf (the way you're using it) is just a wrapper for pdfimages (from poppler). pdfimages does not do the same thing that convert does when given a PDF as input.

convert takes the PDF, renders it at some resolution, and uses the resulting bitmap as the source image.

pdfimages looks through the PDF for embedded bitmap images and exports each one to a file. It simply ignores any text or vector drawing commands in the PDF.

As a result, if what you have is a PDF that's just a wrapper around a series of bitmaps, pdfimages will do a much better job of extracting them, because it gets you the raw data at its original size. You probably also want to use the -j option to pdfimages, because a PDF can contain raw JPEG data. By default, pdfimages converts everything to PNM format, and converting JPEG > PPM > JPEG is a lossy process.

So, try

pdfimages -j file.pdf page

You may or may not need to follow that with a convert to .jpg step (depending on what bitmap format the PDF was using).

I tried this command on a PDF that I had made myself from a sequence of JPEG images. The extracted JPEGs were byte-for-byte identical to the source images. You can't get higher quality than that.


4这是对于提问者问题的错误解决方案,如果PDF是由Illustrator或Acrobat等工具创建的准备打印的PDF文件,因为pdfimages只提取PDF中的图像部分,而不会将每个完整页面展开并导出完整页面成图像。 - GuyPaddock
@GuyPaddock 谢谢你指出这个问题。 - Anmol Singh Jaggi

如果您的pdf文件是扫描的,图片已经作为pdf的一部分保存了。您只需使用pdfimages工具提取它们即可。
pdfimages my-file.pdf prefix 

6这是扫描PDF的完美解决方案,通过一条命令,您可以提取原始的JPG图像,而无需进一步重新压缩。 - Jose Gómez
2如果PDF是由Illustrator或Acrobat等软件创建的可打印PDF,那么这个解决方案对于提问者的问题是不正确的。因为pdfimages只从PDF中提取图像,而不会将每个完整页面压平并导出为图像。 - GuyPaddock

如果您只想将PDF的特定页面转换为PNG格式,您可以使用pdftk命令与convert命令(如上所述described above)进行连接,示例如下:
pdftk document.pdf cat 12 output - | convert - document-page-12.png

你可以使用convert命令,并通过-density选项指定更高的密度。
例如:convert -d 300 foo.pdf bar.png

可以你解释一下密度是什么以及它能做些什么吗? - Raja G
1@AgentCool 它指定了水平和垂直的图像密度(以ppi为单位)。 - Arjun

要从gm convert获取单个页面,只需在PDF名称后面添加[N](其中N是从0开始的页码),例如gm convert foo.pdf[11] out.png将获取PDF的第12页。
对于pdftoppm,请使用-f N -singlefile,其中N是从1开始的页码,例如pdftoppm -f 12 -singlefile foo.pdf out可以得到相同的结果。它似乎总是在输出文件名后面添加“.png”,没有办法停止这个行为。

你可以使用Ghostscript来完成这个任务。
gs -dSAFER -dBATCH -dNOPAUSE -r300 -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=output.png input.pdf

请参阅详细信息https://www.ghostscript.com/doc/9.52/Devices.htm

Master PDF Editor(版本2.2)内置了此选项。打开PDF文件,然后转到文件 > 导出为 > 图像。它会弹出一个对话框,您可以在其中定义输出的不同选项。 非常有用。希望这些信息能够帮到您。

这是免费版还是付费版?在我的版本中,这个选项变灰了。这是否意味着我需要支付?有付费版吗? - Joshua Robison
如果系统在某个时刻崩溃,并且原始文件是具有多页的 PDF,请在从输出中提取部分内容之前,将原始文件的一部分打印为 PDF。 - cipricus