在Linux上使用Ghostscript减小PDF文件大小不起作用

dea*_*arN 12 pdf size resolution ghostscript image-resizing

我有大约50-60个pdf文件(图像),每个文件大1.5MB.现在我不想在我的论文中有如此大的pdf文件,因为这会使下载,阅读和打印成为后方的痛苦.所以我尝试使用ghostscript执行以下操作:

gs \
  -dNOPAUSE -dBATCH \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS="/screen" \
  -sOutputFile=output.pdf \
    L_2lambda_max_1wl_E0_1_zg.pdf
Run Code Online (Sandbox Code Playgroud)

但是,现在我的1.4MB pdf是1.5MB大.

我做错了什么?有什么办法可以检查pdf文件的分辨率吗?我只需要300dpi的图像,所以有人会建议使用convert更改分辨率,或者有一些我可以改变图像分辨率(减少它)gs,因为我使用时图像非常粗糙convert

我如何使用转换:

 convert \
     -units PixelsPerInch \
      ~/Desktop/L_2lambda_max_1wl_E0_1_zg.pdf \
     -density 600 \
      ~/Desktop/output.pdf
Run Code Online (Sandbox Code Playgroud)

示例文件

http://dl.dropbox.com/u/13223318/L_2lambda_max_1wl_E0_1_zg.pdf

Kur*_*fle 16

如果你运行Ghostscript,-dPDFSETTINGS=/screen这只是一种捷径.实际上,您将(隐式地)获得一大堆使用的设置,您可以使用以下命令进行查询:

gs \
  -dNODISPLAY \
  -c ".distillersettings {exch ==only ( ) print ===} forall quit" \
| grep '/screen'
Run Code Online (Sandbox Code Playgroud)

在我的Ghostscript(v9.06prerelease)上,我得到以下输出(稍加编辑以提高可读性):

/screen 
  << /DoThumbnails false 
     /MonoImageResolution 300 
     /ColorImageDownsampleType /Average 
     /PreserveEPSInfo false 
     /ColorConversionStrategy /sRGB 
     /GrayImageDownsampleType /Average 
     /EmbedAllFonts true 
     /CannotEmbedFontPolicy /Warning 
     /PreserveOPIComments false 
     /GrayImageResolution 72 
     /GrayACSImageDict << 
                        /ColorTransform 1 
                        /QFactor 0.76 
                        /Blend 1 
                        /HSamples [2 1 1 2] 
                        /VSamples [2 1 1 2] 
                      >> 
     /ColorImageResolution 72 
     /PreserveOverprintSettings false 
     /CreateJobTicket false 
     /AutoRotatePages /PageByPage 
     /MonoImageDownsampleType /Average 
     /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] 
     /ColorACSImageDict << 
                          /ColorTransform 1 
                          /QFactor 0.76 
                          /Blend 1 
                          /HSamples [2 1 1 2] 
                          /VSamples [2 1 1 2] >> 
     /CompatibilityLevel 1.3 
     /UCRandBGInfo /Remove 
>>
Run Code Online (Sandbox Code Playgroud)

我想知道你的PDF是否是图像密集的,如果这种转换不受欢迎的事情(重新采样带有"错误"参数的图像)会增加文件大小...

如果是这种情况(图像密集的PDF),请告诉我们,我将用一些建议更新这个答案....


更新

我看了一下DNA提供的样本文件.有趣...

不,它包含任何图像.

相反,它包含一个/FlateDecode大流(使用压缩),其中包含大约700.000+(!!)操作,主要是PDF语言中的单向量操作,例如:
m(moveto),
l(lineto),
d(setdash),
w(setlinewidth),
S(中风),
s(closepath和中风),
W*(eoclip),
rgRG(setrgbcolor)
和更少数.

(那段PDF代码编写的AFAICS效率非常低(但确实如此),因为它确实连接了许多短笔画而不是"长"笔画,并且几乎每个笔画都会再次定义颜色(即使它与以前相同),并具有所有其他开销(开始笔划,结束笔划......).

Ghostscript 在这里-dPDFSETTINGS=/screen没有任何影响(例如,没有图像可以下采样).增加的文件大小(准确地说是+48 kByte)可能是由于Ghostscript在解释文件时将一些内部描边等命令重新组织为不同的顺序.

所以关于PDF文件大小,你无能为力 ......

  • ...除非您将每个PDF页面转换为真实图像,例如PNG:
    gs \
      -o out72.png \
      -sDEVICE=pngalpha \
       L_2lambda_max_1wl_E0_1_zg.pdf

(I所使用的pngalpha输出以获得透明背景.)所述的图像尺寸"out.png"259x213px,文件大小是现在70 k字节.但我相信你不会喜欢这个品质:-)

输出质量"不好",因为Ghostscript使用72 dpi的默认分辨率.

既然你说你想拥有300dpi,那么命令就变成了:

gs \
  -o out300.png \
  -sDEVICE=pngalpha \
  -r300 \
   L_2lambda_max_1wl_E0_1_zg.pdf
Run Code Online (Sandbox Code Playgroud)

文件大小现在是750 kByte,图像尺寸是1080x889像素.


更新2

由于Curiosity现在很流行...... :-) ...我试图在Mac上使用Adobe Acrobat X Pro帮助降低文件大小.

你想知道结果吗?

执行"另存为...(缩小文件大小的PDF)" - 这对我来说过去总能产生非常好的结果! - 创建了一个1,8 ++ MByte文件(+ 29%).我想这肯定会把Ghostscript的性能(文件大小增加+ 3%)变成现实的视角!