使用高分辨率将PDF转换为图像

422

我正试图使用命令行程序 convert,将PDF转换为图像(JPEG或PNG)。 这是我正在尝试转换的其中一个PDF文件

我希望程序能够剪裁掉多余的空白,并返回足够高质量的图像,使上标可轻松阅读。

这是我目前的最佳尝试。如您所见,修剪效果很好,我只需要大幅提高分辨率。这是我正在使用的命令:

convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg

我试着做出以下的明智决定:

  • 将图片调整为更大的尺寸(对分辨率没有影响)
  • 尽可能提高图片质量
  • 使用-sharpen特性(我已经尝试了一系列值)

请问有什么建议可以让最终的PNG/JPEG图像分辨率更高吗?感谢您的帮助!


我不知道,你也可以尝试链接... - karnok
1
参见:http://askubuntu.com/a/50180/64957 - Dave Jarvis
如果你在使用Mac系统,可以查看sipsman page文档。 sips是macOS内置的命令行图像编辑器,可用于PDF和许多其他图像类型的处理。 - ghoti
@ghoti sips 只会将 PDF 文件的第一页转换为图像。 - benwiggy
据我所知,您只能“强制” pdftoppm 到特定的分辨率(可能会导致缩小或放大),没有“只使用每个包含图像的原始分辨率”的选项,对吗? - Frank N
24个回答

472

看起来以下代码是有效的:

convert           \
   -verbose       \
   -density 150   \
   -trim          \
    test.pdf      \
   -quality 100   \
   -flatten       \
   -sharpen 0x1.0 \
    24-18.jpg

这将生成左边的图片。将其与我的原始命令结果(右侧的图片)进行比较:

  

(要真正看到并欣赏两者之间的差异,请右键单击每个图像并选择“在新选项卡中打开图像...”)

还需牢记以下事实:

  • 右边模糊的图片文件大小为1,941,702字节(1.85兆字节)。其分辨率为3060x3960像素,使用16位RGB颜色空间。
  • 左边清晰的图片文件大小为337,879字节(330 kByte)。其分辨率为758x996像素,使用8位灰度颜色空间。

因此,无需调整大小;添加-density标志即可。密度值150很奇怪——尝试一系列值会导致两个方向上的图像质量变得更差!


107
density 参数有些特殊,它必须在输入文件之前指定。由于 PDF 是一种基于矢量的文件格式,没有(很多)像素的概念,它会显示“页面为8英寸乘以12英寸”。如果您需要像素,则可以使用 density 设置来告诉它您想在输出中获得多少像素每英寸。例如,使用 150 您将在生成的图像中获得 8x150=1200 乘以 12x150=1800 像素。这也是锐化、对比度、压缩等设置所处理的像素数量。 - Daniel Schneller
10
在Mac OS上,这可能会导致黑色背景(请参见https://dev59.com/82gu5IYBdhLWcg3w_L3J)。为解决此问题,请添加“-flatten”。 - fbiville
3
在尝试将PDF转换为PNG时,我在Mac OS上遇到了黑色背景问题,加入参数“-flatten”解决了这个问题。 - olala
5
哇!刚刚使用了“-density”和“-flatten”选项来缩小PDF文件的大小(生成另一个PDF文件)。其中,“-flatten”选项对于减少总体大小真的非常有帮助。在我的情况下,没有出现任何视觉干扰。 - parvus
3
如果起始图像的质量较低,那么在较高的值上使用“-density”标志可能会得到更差的结果。 - parvus
显示剩余7条评论

205

就我个人而言,我喜欢这个。

convert -density 300 -trim test.pdf -quality 100 test.jpg

文件大小会增加一点,但我认为效果更好。

-density 300 设置PDF呈现的dpi。

-trim 删除与角落像素颜色相同的任何边缘像素。

-quality 100 将JPEG压缩质量设置为最高质量。

-sharpen这样的参数不适用于文本,因为它们会撤销字体渲染系统为使其更易读所做的操作。

如果您确实需要放大,请在此处使用resize并可能使用类似于targetDPI*scalingFactor的较大dpi值。那将以您打算的分辨率/大小呈现PDF。

有关imagemagick.org上的参数说明在此处


它的大小增加了一倍,主要是因为输出密度加倍了,而且jpg压缩质量设置为最大(因此没有太多压缩)。 - rivimey
使用 convert,我们如何知道转换了多少页? - Kiran Reddy
如何在Windows上无需任何第三方工具或在线连接以及没有管理员权限的情况下完成此操作? - Meet
@ Meet请理解,您的问题非常具体,可能在这里难以解释。很遗憾,我不确定您可以在哪里发布这样的问题。希望有人能够帮助。 - Valerio Bozz
@Meet 这在技术上是可行的,但很丑陋。在你的pdf应用程序(edge)中打开pdf文件。放大。截屏。将其粘贴到图像编辑器(paint)中。拖动pdf图像。重复。这很丑陋和耗时,实际上只需像普通用户一样安装imagemagick或graphicsmagick就容易得多。你甚至不需要运行安装程序。获取zip文件,然后从该文件夹中提取并运行即可。不需要特殊权限。 - majinnaibu
显示剩余2条评论

42

我一直没有用convert获得好的效果[2020年5月更新:实际上,它基本上从未为我工作过],但是我使用pdftoppm取得了非常好的效果。以下是从PDF中生成高质量图像的几个示例:

  1. [每页产生约25 MB大小的文件]将输出无压缩的.tif文件格式,分辨率为300 DPI,存储在名为“images”的文件夹中,文件名为pg-1.tifpg-2.tifpg-3.tif等:

     mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [每页生成约1MB大小的文件] 输出为.jpg格式,分辨率为300 DPI:

  3.  mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  4. [每页生成大约2MB的文件] 输出格式为.jpg,且保持最高质量(压缩程度最低)以及300 DPI

  5.  mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg
    

详细解释、选项以及示例,请参见我的完整答案:

https://askubuntu.com/questions/150100/extracting-embedded-images-from-a-pdf/1187844#1187844

相关问题:

  1. [如何使用pdf2searchablepdf将PDF转换为可搜索的PDF?]https://askubuntu.com/questions/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. 交叉链接:
    1. 如何在Linux中使用命令行将PDF转换为JPG?
    2. https://unix.stackexchange.com/questions/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574


32

我在命令行上使用 pdftoppm 来获取初始图像,通常分辨率为 300dpi,所以使用 pdftoppm -r 300,然后使用 convert 进行裁剪和 PNG 转换。


1
虽然没有使用Imagemagick,但这个解决方案似乎最符合透明转换的精神。pdftoppm也可以输出JPEG和PNG格式的文件。 - Aaron Brick
pdftoppm 为我生成了非常漂亮的 JPEG(还比 IM 更小)! 谢谢! - jkd
似乎如果没有使用“-r”标志,pdftoppm将使用pdf的本机分辨率,这是您可以从pdf中获得的最大分辨率。convert工具保留此分辨率。 - Josja
PNG的结果比JPG更优秀:pdftoppm -png -r 300 或者使用-jpegopt quality=100来设置JPEG选项。 - Dabbel

24

通常我使用'pdfimages'以本地分辨率提取嵌入的图片,然后使用ImageMagick的convert转换到所需的格式:

$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName   # save in .ppm format
$ convert fileName-000.ppm fileName-000.png

这将生成最佳且最小的结果文件。

注意:对于有损JPG嵌入式图像,您必须使用-j:

$ pdfimages -j fileName.pdf fileName   # save in .jpg format

最近的"poppler-util"(0.50+, 2016)可以使用“-all”选项,将文件保存为有损压缩的jpg格式或无损压缩的png格式。因此,只需输入以下简单命令:

$ pdfimages -all fileName.pdf fileName

从PDF中提取出最佳质量的内容。

在提供的Win平台上,您需要从以下网址下载最新的'poppler-util'二进制文件(0.68,2018年):http://blog.alivate.com.au/poppler-windows/


只是一个小修正:第一个代码块中的第二个命令应该以 pdftoppm 开头,而不是 pdfimages - satyanarayan rao
不,旧版的pdfimages会像pdftoppm一样将提取的图像保存为ppm格式,而pdftoppm从未具有“-list”选项。当前的pdfimages可以直接使用“-all”选项保存为PNG和JPG格式,如注释中所述。 - Valerio
要在Windows上获取Poppler,msys2是最佳解决方案。 - robertspierre
请注意,最小的MSYS2安装需要400 MB的空间,而http://blog.alivate.com.au/poppler-windows/提供的安装程序只有7 MB。 - Valerio
1
如果原始的PDF文件包含嵌入的图像,则此答案是相关的,但我认为OP示例PDF包含矢量文本,这些文本不是嵌入式图像。因此,在我看来,OP无法使用此方法。无论如何,感谢其他用例。 - mselmany

21
在ImageMagick中,您可以进行"超采样"。您可以指定一个较大的分辨率,然后根据所需的最终输出大小缩小图像。例如,对于您的图像:

在ImageMagick中,您可以进行“超级取样”。您可以指定较高的密度,然后根据所需的最终输出大小进行缩小。例如,对于您的图像:

convert -density 600 test.pdf -background white -flatten -resize 25% test.png


在这里输入图片描述

下载该图片以查看完整分辨率进行比较。

如果你打算进行进一步的处理,我不建议保存为JPG格式。

如果你想要输出与输入相同大小的图像,则将调整大小到你的密度与72的比值的倒数。例如,-density 288 和 -resize 25%。其中, 288=4*72 并且 25%=1/4。

图像密度越大,最终质量就越好,但是处理时间会更长。


16

我发现在批量处理大型PDF转换为PNG和JPG时,使用底层的gs (也称为Ghostscript) 命令比使用convert 更快且更稳定。

你可以在convert -verbose的输出中看到该命令,并且还有一些其他可能需要微调(但无法通过convert直接访问)的地方。

然而,使用gs进行修剪和锐化会更困难,所以,正如我所说,情况因人而异!


10

它还会给你良好的结果:

exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");

7

我是一名Linux用户:我尝试使用convert命令行实用程序(将PDF转换为PNG),但结果不如预期。我发现以下方法更简单,效果更好:

  • 使用pdftk提取pdf页面
    • 例如:pdftk file.pdf cat 3 output page3.pdf
  • 使用GIMP打开(导入)该PDF文件。
    • 重要提示:将导入的分辨率100更改为300600像素/英寸
  • GIMP中导出为PNG(将文件扩展名更改为.png)

编辑:

根据Comments的要求添加图片。已使用的convert命令如下:

convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png

GIMP:以每英寸300像素(px/in)的分辨率导入;以PNG压缩级别3导出。

我没有在命令行上使用GIMP(参见我的评论)。

pdf2png

enter image description here


1
如果你有成千上万的页面,这个能自动化吗? - JBWhitmore
@JBWhitmore:好问题。肯定可以很容易地编写 pdftk 命令脚本,因为它已经在命令行上了。我进行了一个非常快速的谷歌搜索,并发现 GIMP 有批处理模式(我没有尝试过,但它看起来也应该是可编写脚本的):https://www.gimp.org/tutorials/Basic_Batch/ - Victoria Stuart
好的。另外,你能否更新你的答案,附上接受的答案和你的方法得到的结果的并排图片? - JBWhitmore
1
@JBWhitmore,自动化执行此转换的示例脚本在以下问题/答案中显示:https://unix.stackexchange.com/questions/121293/convert-every-pdf-in-the-current-directory-to-png - tsherwen
1
@tsherwen,如果我正确地阅读了那个链接,它是关于如何自动化转换命令的。我不会在如何做到这一点上感到困惑。然而,这个答案说要使用 GIMP 作为其中一个步骤--但是这个答案或者链接似乎都没有展示如何自动化这个过程。 - JBWhitmore
1
@JBWhitmore。我误以为只是在考虑“convert”这个问题。当我阅读您的自动化评论时,我只看到了这个答案提到“convert”的部分和您的问题。感谢您在后来的讨论中给出的答案,我将其与我链接的解决方案结合起来,解决了我遇到的另一个问题。 - tsherwen

3

针对Windows操作系统(已在W11上进行测试):

magick.exe -verbose -density 150 "input.pdf" -quality 100 -sharpen 0x1.0 output.jpg

您需要安装以下软件:

ImageMagick https://imagemagick.org/index.php

ghostscript https://www.ghostscript.com/releases/gsdnld.html

其他信息:

  • 请注意使用-flatten参数时,它只能生成第一页作为图像。

  • 使用-scene 1参数以从索引1开始命名图像。

  • 在问题中提到的convert命令已被弃用,建议使用magick


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