优化PDF文件(使用Ghostscript或其他)

如果你想优化PDF文件并减小文件大小,Ghostscript是最好的select吗?

我需要存储大量的PDF文件,因此我需要尽可能优化和减小文件大小

有没有人有任何经验与Ghostscript和/或其他?

命令行

exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file); 

如果你正在寻找一个免费的(如在“自由”)软件,Ghostscript肯定是你最好的select。 然而,这并不总是很容易使用 – 它的一些(非常强大的)处理选项不容易findlogging。

看看这个答案,它解释了如何执行一个更详细的图像分辨率下采样控制比通用的-dPDFSETTINGS=/screen (它定义了几个整体的默认值,你可能想覆盖):

  • 如何在PDF文件中下载图像?

基本上,它告诉你如何使Ghostscript将所有图像缩小到72dpi的分辨率(这个值是-dPDFSETTINGS=/screen使用的 – 你可能想要更低):

 -dDownsampleColorImages=true \ -dDownsampleGrayImages=true \ -dDownsampleMonoImages=true \ -dColorImageResolution=72 \ -dGrayImageResolution=72 \ -dMonoImageResolution=72 \ 

如果你想尝试Ghostscript是否能够“解嵌”所使用的字体(有时是有效的,有时不能),这取决于embedded字体的复杂性,也取决于使用的字体types ),你可以尝试将以下内容添加到您的gs命令中:

 gs \ -o output.pdf \ [...other options...] \ -dEmbedAllFonts=false \ -dSubsetFonts=true \ -dConvertCMYKImagesToRGB=true \ -dCompressFonts=true \ -c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \ -c ".setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Arial]>> setdistillerparams" \ -f input.pdf 

注意:下采样的图像分辨率肯定会降低质量(不可逆转),并且除非在机器上安装了相同的字体,否则显示和打印PDF将难以或不可能显示和打印PDF。


更新

我在原来的答案中忽略了一个选项就是补充

 -dDetectDuplicateImages=true 

到命令行。 这个参数引导Ghostscript尝试和检测多次embedded在PDF中的任何图像。 如果您使用图片作为徽标或页面背景,并且PDF生成软件未针对此情况进行优化,则可能会发生这种情况。 旧版本的OpenOffice / LibreOffice就是这种情况(我testing了LibreOffice的最新版本v4.3.5.2,它不再做这种愚蠢的事情)。

如果您在pdftk的帮助下连接PDF文件,也​​会发生这种情况。 为了展示效果,以及如何发现它,我们来看一个PDF文件样本:

 pdfinfo p1.pdf Producer: libtiff / tiff2pdf - 20120922 CreationDate: Tue Jan 6 19:36:34 2015 ModDate: Tue Jan 6 19:36:34 2015 Tagged: no UserProperties: no Suspects: no Form: none JavaScript: no Pages: 1 Encrypted: no Page size: 595 x 842 pts (A4) Page rot: 0 File size: 20983 bytes Optimized: no PDF version: 1.1 

Poppler的pdfimages实用程序的最新版本增加了对-list参数的支持,它可以列出包含在PDF文件中的所有图像:

 pdfimages -list p1.pdf page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio -------------------------------------------------------------------------------------- 1 0 image 423 600 rgb 3 8 jpeg no 7 0 52 52 19.2K 2.6% 

这个样本PDF是一个1页的文档,其中包含一个图像,该图像使用JPEG压缩进行压缩,宽度为423像素,高度为600像素,在页面上的分辨率为52 PPI。

如果我们将这个文件的三个副本连接到pdftk的帮助,如下所示:

 pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf 

那么结果通过pdfimages -list显示这些图像属性:

 pdfimages -list p3.pdf page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio -------------------------------------------------------------------------------------- 1 0 image 423 600 rgb 3 8 jpeg no 4 0 52 52 19.2K 2.6% 2 1 image 423 600 rgb 3 8 jpeg no 8 0 52 52 19.2K 2.6% 3 2 image 423 600 rgb 3 8 jpeg no 12 0 52 52 19.2K 2.6% 

这表明,现在有3个相同的PDF对象(ID为4,8和12)embedded在p3.pdfp3.pdf由3页组成:

 pdfinfo p3.pdf | grep Pages: Pages: 3 

通过用参考replace重复图像来优化PDF

现在我们可以在Ghostscript的帮助下应用上面提到的优化了

  gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf 

检查:

  pdfimages -list p3-optim.pdf page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio -------------------------------------------------------------------------------------- 1 0 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6% 2 1 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6% 3 2 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6% 

每页仍然有一个图像 – 但是PDF对象ID现在总是一样的:10。

  ls -ltrh p1.pdf p3.pdf p3-optim.pdf -rw-r--r--@ 1 kp staff 20K Jan 6 19:36 p1.pdf -rw-r--r-- 1 kp staff 60K Jan 6 19:37 p3.pdf -rw-r--r-- 1 kp staff 16K Jan 6 19:40 p3-optim.pdf 

正如你所看到的,使用pdftk制作的“哑巴”连接增加了原始文件的三倍。 Ghostscript的优化带来了相当的数量。

Ghostscript的最新版本甚至可能默认应用-dDetectDuplicateImages(AFAIR,第一次引入它的v.9.02,默认没有使用它。)

您可以通过从PDF转换为Postscript,然后再转换为PDF来获得良好的结果

 pdf2ps file.pdf file.ps ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf 

参数-dPDFSETTINGS的值定义了生成的PDF中图像的质量。 选项是从低到高质量: /screen/default/ebook/printer/prepress ,请参阅http://milan.kupcevic.net/ghostscript-ps-pdf/作为参考。;

Postscript文件可能会变得相当大,但结果是值得的。 我从一个60 MB的PDF文件转换为一个140 MB的Postscript文件,但是最终以1.1 MB的优化PDF结束。

您可能会发现pdftocairo (来自Poppler )可以制作较小的PDF文件,但要注意它会pdftocairo一些function(如超链接)。

我使用Ghostscript从这里采取以下选项。

 gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf 

你会失去质量,但如果这不是一个问题,ImageMagick的convert可能会certificate是有帮助的:

 convert original.pdf reduced.pdf 

(我只是将一个126 MB的文件转换成一个14 MB的文件…)

另请参阅这篇文章的相关选项。

Ghostscript带有两个有用的工具: pdfoptps2pdf14 。 两者都可用于优化PDF文件,但在某些情况下,“优化”文件的大小可能会比原来的大。

这对我有效

转换您的PDF到PS(这将创build一个大文件

 pdf2ps large.pdf very_large.ps 

将新PS转换回PDF

 ps2pdf very_large.ps small.pdf 

资料来源: https : //pandemoniumillusion.wordpress.com/2008/05/07/compress-a-pdf-with-pdftk/