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

问题描述 投票:47回答:7

如果要优化PDF文件并减小文件大小,Ghostscript是最佳选择吗?

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

有没有人有Ghostscript和/或其他的经验?

command line

exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
linux pdf debian ghostscript
7个回答
74
投票

如果您正在寻找免费(如'libre')软件,Ghostscript肯定是您的最佳选择。但是,它并不总是易于使用 - 它的一些(非常强大的)处理选项不容易找到记录。

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

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

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

如果你想尝试Ghostscript能够“解嵌”所使用的字体(有时它可以工作,有时不会 - 取决于嵌入字体的复杂性,以及on the font type used),你可以尝试添加以下内容你的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变得困难或不可能,除非机器上安装了相同的字体....


更新

我在原来的答案中忽略了一个选项是添加

-dDetectDuplicateImages=true

到命令行。此参数使Ghostscript尝试检测多次嵌入PDF中的任何图像。如果您将图像用作徽标或页面背景,并且PDF生成软件未针对此情况进行优化,则会发生这种情况。这曾经是旧版OpenOffice / LibreOffice的情况(我测试了最新版本的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的帮助下连接这个文件的3个副本,如下所示:

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)嵌入在p3.pdf中。 p3.pdf共有3页:

pdfinfo p3.pdf | grep Pages:

 Pages:          3

Optimize PDF by replacing duplicate images with references

现在我们可以在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,v9.02,它是第一次引入它,默认情况下不使用它。)


26
投票

您可以通过从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。


7
投票

我使用Ghostscript以及从here获取的以下选项。

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

5
投票

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


4
投票

你会失去质量,但如果不是问题,那么ImageMagick的convert可能会有所帮助:

convert original.pdf reduced.pdf

请注意,它并不总是有效:我曾使用此命令将126MB文件转换为14MB文件,但另一次将350Ko文件的大小加倍。

无论如何,值得尝试一下......

正如在评论中提到的那样,将这个命令应用于基于矢量的PDF当然没有意义,它只对光栅化图像有用。

有关相关选项,另请参见this post


3
投票

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


2
投票

这对我有用

将PDF转换为PS(这会创建一个大文件

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/

© www.soinside.com 2019 - 2024. All rights reserved.