如何减小扫描PDF文件的文件大小?

我有一个大小为72.9MB的PDF文件,我需要将其压缩到500KB以下。
该文件是我扫描后转换成PDF格式的JPEG图像。

1这取决于占用空间的内容...需要更多的信息。压缩图像空间可能有所帮助,但如果你想要尝试对大文件进行堆喷射攻击,那是行不通的。真的需要更多的信息。 - RobotHumans
1将其转换为DjVu格式,而不是试图将其缩小为不可能大小的PDF(根据来源)。 - zetah
文件是我扫描后转换成PDF格式的JPEG图像。 - tamimym
1似乎只能稍微减小文件大小,但是pdfopt具有简单的语法,并且可以提高在iPad时代的加载和翻页速度。 :-) - Ari B. Friedman
2将PDF转换为PS在扫描的PDF文件中并不有效。我试图将大小为56 MB的PDF文件转换为PS文件,但是PS文件的大小变成了1.3 GB,然后再使用ps2pdf转换为45 MB的文件。 - user124118
请查看此相关问答,其中列出了一些使用Ghostscript的图形用户界面,可以更轻松地减小PDF文件大小。 - Glutanimate
请注意,楼主似乎错误地将错误答案标记为已接受。他的附带评论感谢Ghostscript解决了问题,但是Ghostscript并不在这个答案中,而是在另一个答案中。 - Ray Butterworth
我已经尝试了下面几乎所有的方法,以将一个大约10MB的PDF文件压缩到所需的1MB以下,只有shrinkpdf对我有效。在这里,我可以微调dpi并将其转为灰度,以获得一个仍然可读但紧凑的版本。非常棒的工具! - Wolfson
25个回答

使用以下的 ghostscript命令:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

-dPDFSETTINGS的摘要:

  • -dPDFSETTINGS=/screen 降低质量,减小文件大小。(72 dpi
  • -dPDFSETTINGS=/ebook 提供更好的质量,但稍大一些的PDF文件。(150 dpi
  • -dPDFSETTINGS=/prepress 输出类似于Acrobat Distiller的“Prepress Optimized”设置。(300 dpi
  • -dPDFSETTINGS=/printer 选择与Acrobat Distiller的“Print Optimized”设置相似的输出。(300 dpi
  • -dPDFSETTINGS=/default 选择输出以在各种用途中都有用,可能会导致较大的输出文件。

参考:https://ghostscript.readthedocs.io/en/latest/VectorDevices.html#controls-and-features-specific-to-postscript-and-pdf-input

PostScript和PDF输入的控制和特性

-dPDFSETTINGS=configuration

将“熔炼参数”预设为四个预定义设置之一:

  • /screen 选择低分辨率输出,类似于Acrobat Distiller(版本X及以下)的“屏幕优化”设置。
  • /ebook 选择中等分辨率输出,类似于Acrobat Distiller(版本X及以下)的“电子书”设置。
  • /printer 选择与Acrobat Distiller的“打印优化”(版本X及以下)设置相似的输出。
  • /prepress 选择与Acrobat Distiller的“印前优化”(版本X及以下)设置相似的输出。
  • /default 选择输出,旨在适用于各种用途,可能会导致输出文件较大。
每个设置的精确参数,包括它们的DPI值,都在这个表格中的数十个选项中显示:https://ghostscript.readthedocs.io/en/latest/VectorDevices.html#distiller-parameters

2一个还可以制作Nautilus脚本来访问每个文件的功能。 - Sina
21这应该是被接受的答案。Ghostscript 是 Unix 系统上 唯一 的 PDF、XPS 和 PS 实现,几乎可以做任何事情,并提供最佳质量... - dom0
9@新浪科技:实际上,有一个使用Zenith GUI的鹦鹉螺脚本,利用了这个gs命令及其所有质量级别选项:https://launchpad.net/compress-pdf - Sadi
55这是对于这个问题(压缩一个主要是位图数据的PDF文件)的正确答案。我发现screen设置对我来说质量太低,但是ebook效果很好,将一个33Mb的基于扫描的PDF文件压缩到了3.6Mb,并且保持了非常清晰可读的效果。其他-dPDFSETTINGS选项的选择可以在这里找到:http://milan.kupcevic.net/ghostscript-ps-pdf/,将它们包含在这个答案中可能是一个不错的主意。 - naught101
7可用的配置参数:http://ghostscript.com/doc/current/Ps2pdf.htm - Antonios Hadjigeorgalis
1高质量的默认压缩将一份黑白PDF扫描从38.2 MB压缩至6.4 MB,而且没有明显的质量损失。显然原始编码非常低效。谢谢! - pietrodn
@pietrodn,原始编码可能是位图。如果它保存了每个像素而没有压缩,我不会说这是低效的。相反,看起来GS在压缩方面做得很好。 - Turion
有没有适用于这个的图形用户界面? - Orion
417.10那天它把42MB的PDF文件变成了127MB :( - YaSh Chaudhary
1我的PDF文件大小也增加了... :( - Millemila
1根据这个,我创建了一个方便的脚本叫做pdf_compress.sh,可以在https://github.com/erikw/dotfiles/blob/personal/bin/pdf_compress.sh找到。 - Erikw
我使用这些说明来压缩PDF文件。然而,我遇到了很多错误。我在这里详细描述了问题。如果您能看一下并帮助我解决,我将不胜感激。 - Foad
dCompatibilityLevel的值重要吗?它会在不同的Ghostscript版本中发生变化吗? - shevy
1使用Ubuntu 20.04和gs 9.50,这个操作失败了,出现了分段错误... - Nuno
在Ubuntu 20.04上,它运行得很好,将一个3页的PDF从3.8MB减小到了330KB,但是完全无法阅读。看起来像是25DPI。非常像素化。这是我运行的命令:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf - Gabriel Staples
...而且其他设置看起来很棒,但是根本没有减小PDF的大小。:( 请注意,这是从我的pdf2searchablepdf程序的OCR输出。 - Gabriel Staples
看起来这个命令也被某人保存为gist了:https://gist.github.com/firstdoit/6390547。 - Gabriel Staples
前几天我弄错了,实际上使用-dPDFSETTINGS=/ebook是可以正常工作的。例如:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf in.pdf。这与ps2pdf -dPDFSETTINGS=/ebook in.pdf out.pdf非常相似(如果不是完全相同的话?),因为ps2pdf实际上只是Ghostscript(gs)的一个包装器。此外,关于-dPDFSETTINGS=的参考,请参阅https://www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN,以及这里的表格:https://www.ghostscript.com/doc/current/VectorDevices.htm#distillerparams。 - Gabriel Staples
我现在在这里添加了一个答案,源自于这个和其他答案:https://askubuntu.com/a/1303196/327339。 - Gabriel Staples
这在我尝试过的每一次都完全无效,无论原始图像来自哪个扫描仪,使用了什么质量设置。 - Peter
不要使用这个。/ebook/screen等会对PDF进行降采样,即它们会减少像素的数量 - 这是一种非常低效/损失的压缩PDF的方式。与其进行降采样,不如使用图像压缩 - 这样可以得到更好的最终结果(至少在有足够像素的情况下):convert -density 300 input.pdf -quality 30 output.pdf - Zaz
太棒了!非常感谢!我刚刚将一个500 KB的护照扫描件压缩到了140 KB,使用了屏幕而不是电子书。 - fahd
@Zaz 在 Unix 上至少找不到 "convert"。 - Caleb Stanford
这个方法效果还不错,但是出现了几次这个错误:**** 错误:在处理图像时遇到了“rangecheck”错误。输出可能不正确。而且似乎删除了源PDF中的一些图像。 - Caleb Stanford
初始化降采样滤波器失败,降采样操作中止。 - Sumit Wadhwa
1@Zaz,你给出的convert命令(convert -density 300 input.pdf -quality 30 output.pdf)将一个可搜索的962 KB文件转换为一个非可搜索的4.5 MB文件,使得这个“压缩”后的PDF文件大小接近原来的5倍。这绝对不是我寻找的命令。 - Gabriel Staples
1@GabrielStaples:抱歉。澄清一下,ImageMagick的convert只适用于纯图像的PDF文件。所以如果你扫描一个文档,使用convert比上面的命令更好,因为它会压缩页面而不是降低像素数(减少像素数量)。 - Zaz
在一个包含矢量图像的PDF文件上使用了这个工具,效果还不错。然而,在压缩后,一些矢量图像在Safari中只显示为黑色方块,但在其他浏览器(Chrome/Firefox)中却完全正常。 - Chris
在我的Mac上也很好用(Homebrew gs) - Magnus

我最喜欢的方法是将PDF转换为PostScript,然后再转回来。虽然它并不总是有效,但当它有效时,结果非常好。
ps2pdf input.pdf output.pdf

这也可以直接在PDF上操作,正如评论中建议的那样。
一些用户还报告了在使用电子书设置时获得更多成功的情况。
ps2pdf -dPDFSETTINGS=/ebook input.pdf output.pdf

21尽管这种方法成为我最喜欢的压缩PDF文件的解决方案,但它会破坏文档中可能存在的URL链接(而@Michael D的方法则不会出现这种情况)。除此之外,运行这段代码只能让我感叹其卓越之处!(: - Rubens
1@Rubens 啊,我不知道它会破坏网址链接的事实。谢谢你提醒。 - don.joey
4这个绕过了密码保护...只是说说而已 - j-i-l
太棒了!与在Evince中打印到PostScript文件相比,质量没有明显变化。 - balu
对于第二个命令,我会使用这个简写:ps2pdf output.{ps,pdf} - GNUSupporter 8964民主女神 地下教會
13ps2pdf可以将PDF作为输入,因此您可以一步完成此操作:ps2pdf input.pdf output.pdf - frabjous
1这个命令实际上将来自Google图书的PDF文件大小增加了10倍!但至少我的Kindle现在可以显示这个处理过的PDF中的所有字符。 - Vladimir F Героям слава
@VladimirF 在这种情况下,尺寸增加是合理的。 - don.joey
@Pablo,作为第二次编辑的编辑者,我知道你想做得好,但是如果你要添加那么多信息,它应该有自己独立的答案。 - don.joey
2@don.joey搞不懂为什么,既然只是扩展了你的答案。这里的主要问题是:ps2pdf也使用ghostscript,因此你可以使用类似-dPDFSETTINGS=/ebook的参数。 - Pablo Bianchi
@PabloBianchi 我认为你的回答是一个有效的替代方案。我喜欢我的回答简洁明了,但是你的回答在列表中肯定有它的位置。所以请随意更新并将其作为你自己的回答添加进去。 - don.joey
将398MB的扫描PDF文件压缩至397MB! - wbad
@wbad 这意味着可能已经应用了所有可能的压缩,我怀疑你在不改变质量的情况下能否降低文件大小。 - don.joey
我很匆忙,但它效果很好,非常感谢! :) - flawr
9虽然尝试了(84 MB→82 MB),但是根据@PabloBianchi的建议,使用ps2pdf -dPDFSETTING=/ebook in.pdf out.pdf,文件大小缩小到了272 kB!非常感谢! - Frédéric Grosshans
ps2pdf -dPDFSETTINGS=/ebook效果非常好。从14兆缩小到4兆。谢谢! - ndstate
非常感谢您的解决方案,它真的很有帮助!同时,这也是一种快速减小PDF文件大小的方法。我想知道是否应该在Linux上最受欢迎的文档查看器中包含这样的选项,您知道有哪些软件包含了这个功能吗? - EnriqueBet
太棒了!使用ps2pdf -dPDFSETTINGS=/ebook input.pdf output.pdf命令,一个由我的pdf2searchablepdf程序输出的3页、大小为3.8 MB的输入文件被压缩到了916 KB!不过需要注意的是,ps2pdf input.pdf output.pdf没有起到任何作用。这是在Ubuntu 20.04上进行的操作,原始PDF已经以300 DPI的分辨率开始处理,具体可参考我的脚本运行,首先使用pdftoppm -tiff -r 300 "$pdf_in" "$temp_dir/pg"命令转换为TIFF格式。 - Gabriel Staples
注意:链接已失效 :(:https://ghostscript.com/doc/current/Ps2pdf.htm#Options - Gabriel Staples
试试这个:https://www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN。我也在[这里](https://gist.github.com/firstdoit/6390547#gistcomment-3573956)发布了它。 - Gabriel Staples
为了进一步压缩,可以使用ps2pdf -dPDFSETTINGS=/screen input.pdf output.pdf命令。尽管/screen选项的质量比/ebook选项差,但压缩效果更好。 - dheerendra
哈哈哈,这太奇怪了,它把一堆竖版页面变成了横版! - Caleb Stanford
在手动修复所有旋转页面之后,这个解决方案对我来说效果最好。默认命令将文件大小从46 MB压缩到20 MB。 - Caleb Stanford


27非常感谢您的建议,Ghostscript shell 真是神奇,将其压缩到了460KB :) - tamimym
那并不一定是真的。如果内容从图像转换为文本,那就更加可行了。(前提是文本被准确地进行了OCR处理) - monksy
7我推荐你使用shrinkpdf.sh脚本,你可以自定义代码以使用你想要的ppi值(默认为72),从而达到你需要的文件大小而不牺牲太多质量。这使得我能够上传一个11MB的扫描文档,并将其最大大小限制在3MB,同时不会损失太多质量。 - Severo Raz
9shrinkpdf非常好用! - AmanicA
第一个链接,使用"/ebook"设置,将一个19MB的扫描文件压缩至4.2MB,并且扫描文本仍然可读。 - dremodaris
4请问OP所指的ghostscript shell在哪里可以找到?链接为https://askubuntu.com/questions/113544/how-can-i-reduce-the-file-size-of-a-scanned-pdf-file#comment134224_113547。 - user13107
shrinkpdf对我很有用!您必须安装ghostscript并确保命令'gs'在PATH中可用才能使其正常工作。在macOS上,您可以使用'brew install ghostscript'来安装ghostscript。 - pcx
1@user13107 这是答案 - https://askubuntu.com/a/256449/171427 - callmekatootie
对我来说,https://docupub.com/pdfcompress/(**pdfcompress**)获得了最好的结果。 - Michael D
第一个链接,/电子书设置,将2.2MiB的PDF文件压缩至144.5KiB。 - mydoghasworms
1第一个链接是一个长页面,用于gs单行命令行。第二个链接是最好的选择,一个灵活的脚本 http://www.alfredklomp.com/programming/shrinkpdf/。第三个链接功能有限(转换为ps并再转回pdf,没有选项)。第四个链接暗示将你的PDF文件发送给一个未知的第三方在线服务(但嘿,它是*免费*的!),不推荐使用。所以我建议使用 http://www.alfredklomp.com/programming/shrinkpdf/。 - Stéphane Gourichon

如果您有一份带有扫描图像的pdf文件,您可以使用convert(ImageMagick)来创建一个带有jpeg压缩的pdf文件(您可以在任何pdf上使用此方法,但会丢失所有文本信息)。
例如:
convert -density 200x200 -quality 60 -compress jpeg input.pdf output.pdf

调整参数以符合您的需求
  • -density: 像素密度(例如100x100)的dpi。更高的像素密度可以提高质量和大小
  • -quality: 压缩比例。对于jpg格式,它的取值范围是1到100,100表示最佳质量但最低压缩率
  • -compress: 压缩算法。由于压缩产生的伪像问题,JPEG压缩可能不是最佳选择。您可以选择BZip、Fax、Group4、JPEG、JPEG2000、无损、LZW、RLE或Zip作为替代的压缩方法(某些方法仅适用于黑白图像)。

我能够在扫描/摄影文档中实现很好的压缩比例(取决于设置)。根据文档来源,您可能需要减少颜色深度(使用-depth参数)。


4对于扫描文档而言,如果你只关心文字而不是图像,并且保留深度不是问题的话,JPEG压缩并不是一个好主意,因为其产生的伪影往往非常明显。如果你使用pdfimages input.pdf pages来提取pbm文件,那么你可以这样做:for page in *.pbm; do convert $page -compress Group4 -type bilevel TIFF:- | convert - output.pdf。任何OCR都将丢失,所以我通常会接着执行pdfsandwich output.pdf,这似乎可以进一步减小文件大小。 - Brian Z
1@BrianZ 当然,JPEG压缩并不总是最佳选择,但对于我来说,它是处理混合类型文档的最佳方法。我在回答中添加了一些关于其他压缩方法的信息。 - someonr
3这种方法最终在幕后使用gs - alfC
2дёәдәҶиҝҗиЎҢе‘Ҫд»Ө--density --quality --compressдёҺ-density -quality -compressзҡ„йҖүйЎ№пјҢжҲ‘дёҚеҫ—дёҚдҪҝз”ЁеҸҢз ҙжҠҳеҸ·гҖӮ - Rotareti
2如果图像质量不是最重要的问题(你只是想要将那个该死的电子邮件附件变小以便发送),可以添加 -resize 50% ,根据扫描时使用的DPI大小调整百分比。 - chrki
请问您能解释一下-quality选项吗?比如我如何实现低、中和高质量的压缩? - rahim.nagori
@rahim.nagori 我在回答中添加了一些更多的信息和一个链接,其中包含有关质量标志的更多细节。 - someonr
这是唯一对我有效的方法。我有一个5页62MB的PDF扫描文件,所有其他选项(ghostscript、ps2pdf、libre office...)都失败了。相反,只需要使用convert -resize 30% input.pdf output.pdf命令,文件就被压缩到了12MB,虽然有点粗糙但仍然可读。 - Gabriele Buondonno
1它增加了我的扫描PDF图像:原始文件为14 MiB,转换后的PDF为24 MiB。 - somenxavier
这对我来说以前完美运行。但是现在,使用Ubuntu 20.04和ImageMagick 6.9.10-23 Q16 x86_64,它不再工作。它失败并显示以下错误信息:"convert-im6.q16: no images defined `output.pdf' @ error/convert.c/ConvertImageCommand/3258" - Nuno
@Nuno 似乎是一个政策问题,请在/etc/ImageMagick-7/policy.xml中评论gs的政策。 - aksh1618
对于一个相当大的文件,这个完全占用了我的所有CPU核心数好几分钟。不推荐。 - Peter
在Arch上工作,但Ubuntu的ImageMagick似乎太笨了。 - france1
这是一个比Ghostscript更灵活的解决方案,因为我处理的是由JPG组成的PDF。 - Ucodia
这比通过调整-density-quality选项更灵活地进行微调,从而实现更精细的调整。提高其中一个选项会增加输出文件的大小,但可以通过减小另一个选项来进行补偿,具体取决于所需的视觉效果。 - Giuseppe
我对这个有问题,如果PDF文件的大小很大,转换过程会突然占用大量内存,最终导致内存溢出(OOM)... 我有1000个扫描文档,配备了20GB的内存,但它卡住了,需要强制重启... - Benyamin Limanto

我需要缩小一个包含全彩色扫描文档的PDF文件。在文件中,每一页都是一张全彩色图像。这些图像是包含文本和图片的页面的图像副本,通过扫描生成。
我使用了下面的Ghostscript命令和另一个线程中的命令的组合。
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true \
-dColorImageResolution=150 -dNOPAUSE  -dBATCH -sOutputFile=output.pdf input.pdf

这将图像分辨率降低到150dpi,文件大小减少了一半。查看文档时,几乎没有明显的图像质量损失。文本在我的2012年Nexus7上仍然完全可读。

7+1 对于降低图像分辨率但保持文本为矢量化的做法。这在不使我的文本出现像素化的情况下产生了巨大的改变。 - Jason O'Neil
2太棒了,通过这个命令可以调整分辨率 - 这比只使用dPDFSETTINGS=\screen得到了更好的结果。 - exchange
参见:https://stackoverflow.com/questions/9497120/how-to-downsample-images-within-pdf-file/9571488 - sanmai
1+1选项允许您指定精确的分辨率,非常适用于扫描的PDF文件(全部为光栅图像),希望在保持文件可读性的同时减小文件大小。 - Michele Piccolini

这里有一个脚本可以用来重写扫描的PDF文件:

#!/bin/sh

gs  -q -dNOPAUSE -dBATCH -dSAFER \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.3 \
    -dPDFSETTINGS=/screen \
    -dEmbedAllFonts=true \
    -dSubsetFonts=true \
    -dColorImageDownsampleType=/Bicubic \
    -dColorImageResolution=72 \
    -dGrayImageDownsampleType=/Bicubic \
    -dGrayImageResolution=72 \
    -dMonoImageDownsampleType=/Bicubic \
    -dMonoImageResolution=72 \
    -sOutputFile=out.pdf \
     $1

你可以稍微定制一下,使其更具可重用性,但如果你只有一个pdf文件,你可以简单地将$1替换为你的pdf文件名,并放入终端运行。

1太棒了,谢谢Oli。你几乎回答了我在这里提出的所有问题 :-D - Rob Cowell
这是一个很好的答案,但至少在我的情况下,将一个有些大(> 10Mb)的PDF文件转换需要非常长的时间(超过一分钟)。 - Gabriel
1不确定发生了什么,但是一个30 MB的PDF文件生成了一个68 MB的文件。它并没有缩小,反而变大了。如果按照下一个回答所述直接使用ps2pdf,结果一样。 - Ed Villegas
1@EdVillegas 我能想到的唯一解释(关于这种增加)是图像的分辨率比生成的图像低(72dpi)。或者某种方式导致字体嵌入吸收了所有的字体。 - Oli
1使用pdfimages -list file.pdf命令可以查看PDF文件中图片的原始分辨率。 - vstepaniuk

我使用LibreOffice Draw打开pdf文件。 然后我选择“导出为pdf”。 接着,我设置“jpeg压缩质量”为50%和“图像分辨率”为150 dpi。 这样做会得到很好的效果。

4问题的最糟糕解决方式!它完全搞乱了我的文件! - user783132
3对于我来说,这个解决方案是最好的,只需要根据所需进行配置。使用这些设置,将"JPEG压缩质量"设置为83%和"图像分辨率"设置为150 dpi。 - Indacochea Wachín
这对我有用 - Raj
我更倾向于设置300 DPI和50%压缩,但这取决于PDF的内容。 - france1

我通常使用ps2pdf来做这个(语法更简单),就像这样:
ps2pdf -dPDFSETTINGS=/ebook BiggerPdf SmallerPDF

我使用以下的Python脚本来减小生产服务器(8.04)中一个目录下所有PDF文件的大小。所以它应该能够正常工作。
#!/usr/bin/python

import os

for fich in os.listdir('.'):
        if fich[-3:]=="pdf":
                os.system("ps2pdf -dPDFSETTINGS=/ebook %s reduc/%s" % (fich,fich))

谢谢你提供的另一种解决方案。我先尝试了Oli给出的方法,得到了我所需要的结果,但我也会保存这个方案以备将来参考。 - Rob Cowell
3-dPDFSETTINGS=/printer选项缩小50%。电子书缩小90%。 - neouyghur

对我来说最好的是
convert -compress Zip -density 150x150 input.pdf output.pdf

其他方式:
#### gs
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf $INPUTFILE

### pdf2ps && ps2pdf
pdf2ps input.pdf output.ps && ps2pdf output.ps output.pdf

### Webservice
http://compress.smallpdf.com/de

致敬

1很好的解决方案。易于记忆,而且在可读性上几乎没有明显损失,将我的 PDF 文件大小从 32 MB 缩小到了 3.5 MB。 - Immanuel Weihnachten
我喜欢第二种方式 pdf2ps input.pdf temp.ps && ps2pdf14 temp.ps output.pdf && rm temp.ps - McPeppr

对于我基于pdfsizeopt的另一个答案,请参见这里
参考这个答案这个答案,在尝试了这里的一堆答案并进行了大量的研究和实验之后,我得出了以下结论。请注意,我已经从其他答案中删除了命令中使用的-dCompatibilityLevel=1.4部分(包括最受赞同的答案),因为这个表格表明今天(2020年12月27日)自动使用1.51.7来设置此选项,并且没有必要覆盖这些值。
使用Ghostscript(gs)将input.pdf压缩为output.pdf
3个主要的压缩级别: 注意:你也可以添加-dQUIET来抑制所有输出到stdout。参见:https://ghostscript.readthedocs.io/en/latest/Use.html
低压缩:300 dpi(文件较大)
gs -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dNOPAUSE -dBATCH \
-sOutputFile=output.pdf input.pdf

[在我的测试中最好] 中等压缩(推荐):150 dpi(文件大小适中)
gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook   -dNOPAUSE -dBATCH \
-sOutputFile=output.pdf input.pdf

高压缩:72 dpi(文件较小,但在某些情况下可能会产生颗粒状或不可读的结果,请尝试并评估效果)
gs -sDEVICE=pdfwrite -dPDFSETTINGS=/screen  -dNOPAUSE -dBATCH \
-sOutputFile=output.pdf input.pdf

你还可以在命令前面加上time来查看执行所需的时间(这适用于任何 Linux 命令)。示例输出:
$ time gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile=out.pdf in.pdf
GPL Ghostscript 9.50 (2019-10-15)
Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Processing pages 1 through 15.
Page 1
Loading NimbusSans-Regular font from /usr/share/ghostscript/9.50/Resource/Font/NimbusSans-Regular... 5205104 3852122 2872760 1487237 3 done.
Page 2
Page 3
Page 4
Page 5
Page 6
Page 7
Page 8
Page 9
Page 10
Page 11
Page 12
Page 13
Page 14
Page 15

real    0m1.326s
user    0m1.142s
sys     0m0.048s

如果您在命令中添加-dQUIET,将不会显示任何Ghostscript输出,并且在前面使用time时将得到以下结果:
$ time gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -dQUIET -sOutputFile=out.pdf in.pdf

real    0m1.018s
user    0m0.976s
sys     0m0.040s

你还可以使用ps2pdf,它是gs的一个封装器,并且产生非常相似但不完全相同的结果。然而,我更喜欢直接使用上面展示的gs 低压缩:300 dpi(文件较大)
ps2pdf -dPDFSETTINGS=/printer input.pdf output.pdf

中等压缩(推荐):150 dpi(文件大小适中)
ps2pdf -dPDFSETTINGS=/ebook   input.pdf output.pdf

高压缩:72 dpi(文件较小,但在某些情况下可能会产生颗粒状或不可读的结果,请尝试并自行判断)
ps2pdf -dPDFSETTINGS=/screen  input.pdf output.pdf

PDF压缩测试

在我的pdf2searchablepdf脚本生成的输出上测试上述gs命令,我看到以下结果:

  1. 低压缩:对于已经生成300 dpi输出PDF的脚本来说,没有显著影响。因此,一个3.8 MB、3页输入PDF的输出结果为~3.8MB
  2. [最佳] 中等压缩:文件被很好地压缩!一个3.8 MB、3页输入PDF的输出结果为~0.95MB
  3. 高压缩:可能过度了。一个3.8 MB、3页输入PDF的输出结果为~0.37MB,但在我的特定测试中,由于输入PDF本身分辨率较低,所以完全无法阅读。如果你使用高质量/高分辨率的输入PDF开始,可能会得到更好、可读性更强的结果。

Ghostscript(gs)文档:

有关所有可用的-d("define")PDFSETTINGS,请参见此处:https://ghostscript.readthedocs.io/en/latest/VectorDevices.html#controls-and-features-specific-to-postscript-and-pdf-input。我已经引用了该部分内容,除了我以粗体形式添加了每个设置的DPI值,取自这个表格。您可以参考该表格,查看gs为每个PDFSETTINGS选项选择的数十个较低级别的设置。

PostScript和PDF输入的控制和特点

-dPDFSETTINGS=configuration

将“分辨率参数”预设为四种预定义设置之一:

  • /screen (72 dpi) 选择与Acrobat Distiller(直到版本X)中的“屏幕优化”设置类似的低分辨率输出。
  • /ebook (150 dpi) 选择与Acrobat Distiller(直到版本X)中的“电子书”设置类似的中分辨率输出。
  • /printer (300 dpi) 选择与Acrobat Distiller中的“打印优化”(直到版本X)设置类似的输出。
  • /prepress (300 dpi) 选择与Acrobat Distiller中的“印前优化”(直到版本X)设置类似的输出。
  • /default (72 dpi) 选择旨在适用于各种用途的输出,但可能会导致输出文件变大。
您还可以在此页面上查看各种选项的定义:https://ghostscript.readthedocs.io/en/latest/Use.html

-dNOPAUSE
禁用每页末尾的提示和暂停。通常在将输出发送到打印机或文件时,应使用此选项(与-dBATCH一起);对于由其他程序“驱动”Ghostscript的应用程序也可能需要使用此选项。

-dBATCH
使Ghostscript在处理命令行上指定的所有文件后退出,而不是进入交互式循环读取PostScript命令。相当于在命令行末尾加上-c quit

-dQUIET
抑制标准输出上的常规信息注释。在将设备输出重定向到标准输出时,目前需要使用此选项。