一尘不染

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

linux

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

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

是否有人对Ghostscript和/或其他有任何经验?

命令行

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

阅读 896

收藏
2020-06-02

共1个答案

一尘不染

如果您正在寻找免费(如“自由”)软件,那么Ghostscript无疑是您的最佳选择。但是,它并不总是易于使用-它的某些(非常强大的)处理选项不容易找到文档。

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

基本上,它告诉您如何使Ghostscript将所有图像降采样至72dpi的分辨率(此值即是-dPDFSETTINGS=/screen使用的值,您可能想降低到更低):

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

如果您想尝试Ghostscript是否也可以“取消嵌入”所使用的字体(有时可以工作,有时则不行-取决于嵌入式字体的复杂性以及所,可以尝试将以下内容添加到您的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,并且不再做这种愚蠢的事情)。

如果在的帮助下合并PDF文件,也​​会发生这种情况pdftk。为了展示效果以及如何发现效果,让我们看一个示例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的分辨率进行渲染。

如果我们在这样的帮助下连接此文件的3个副本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%

这表明p3.pdf现在嵌入了3个相同的PDF对象(具有ID 4、8和12)。p3.pdf包含3页:

pdfinfo p3.pdf | grep Pages:

 Pages:          3

通过用引用替换重复图像来优化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的优化使它大大减少了。

-dDetectDuplicateImages默认情况下,最新版本的Ghostscript甚至可以应用。 (首次引入该功能的AFAIR
v9.02,默认情况下未使用。)

2020-06-02