合并PDF的Ghostscript压缩结果

问题描述 投票:64回答:3

我发现这个巧妙的命令可以使用Ghostscript将多个PDF合并为一个:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf

结果大小小于2个PDF的总大小。

使用单个文件作为输入运行命令仍会生成较小尺寸的输出文件。

Ghostscript上是否有一个选项可以仅复制合并时显示的页面而不进行任何压缩?

如果不是,那么Ghostscript压缩是否有可能会如此好,以至于绝对不会导致质量损失?

pdf ghostscript
3个回答
71
投票

以下是使用additional options作为设备时可以通过的pdfwrite。根据该页面,如果您没有通过任何内容,则-dPDFSETTINGS会被设置为接近/screen的内容,尽管它不会变得更加具体。您可以尝试将其设置为-dPDFSETTINGS=/prepress,它只能压缩300 dpi以上的图像。

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=out.pdf in1.pdf in2.pdf

另一种选择是pdftk

pdftk in1.pdf in2.pdf cat output out.pdf

33
投票

您观察到的某些大小优化可能来自Ghostscript清理未使用的对象,其最近获得的字体优化改进(您使用的是GS的最新版本吗?!?)以及可能对图像进行重新采样/降采样可能发生过。

Ghostscript,如果用于PDF-> PDF转换,则基本上是这样的:

  1. 读取输入文件及其所有对象,并将其转换为用于图形页面表示的内部格式。
  2. 以内部格式对页面内容进行操作在命令行上要求的操作
  3. 写出一个全新的PDF。

这意味着对于大多数PDF-> PDF操作,PDF对象将具有不同的顺序和编号,甚至对象的内部代码也可能已更改(即使您的眼睛没有发现两者之间的任何区别)输入和输出PDF)。

默认情况下,Ghostscript还将压缩在原始文件中未压缩的任何对象流(但这是无损压缩)。

现在您的命令行非常简单它不包含任何操作希望,您要使用-dPDFSETTINGS=/default的Ghostscript 假定,隐式设置此参数并相应地进行操作。

现在做什么/default PDFSETTINGS ?!您有两种选择可以找到:

  1. 阅读手册。大的table in middle of this section给出了概述。您可以看到,此-dPDFSETTINGS=/default本身只是它代表的其他几十个更具体设置的简写。给定文档的链接适用于开发代码的当前HEAD 当然,您实际使用的版本可能会有所不同

  2. 向您自己的Ghostscript查询此设置的详细含义。我对问题'Querying Ghostscript for the default options/settings of an output device...'和问题'What are PostScript dictionaries, and how can they be accessed (via Ghostscript)?'的回答对此做了详细说明。简而言之,要查询Ghostscript的/default PDFSETTINGS的详细信息,请运行以下命令:

     gs \
       -q \
       -dNODISPLAY \
       -c ".distillersettings /default get {exch ==only ( ) print ===} forall quit"
    

    您应该得到与此非常相似的结果:

      /Optimize false
      /DoThumbnails false
      /PreserveEPSInfo true
      /ColorConversionStrategy /LeaveColorUnchanged
      /DownsampleMonoImages false
      /EmbedAllFonts true
      /CannotEmbedFontPolicy /Warning
      /PreserveOPIComments true
      /GrayACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >>
      /DownsampleColorImages false
      /PreserveOverprintSettings true
      /CreateJobTicket false
      /AutoRotatePages /PageByPage
      /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 << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >>
      /DownsampleGrayImages false
      /UCRandBGInfo /Preserve
    

    唯一突出的方面是:您可能需要将/AutoRotagePages/PageByPage更改为/None。在命令行上,您将其输入为-dAutoRotatePages=/None

    为您提供完整的参数列表,这些参数专门告诉Ghostscript通过添加以下参数,尽可能多地将passthrough模式应用于输入PDF:

      -dAntiAliasColorImage=false \
      -dAntiAliasGrayImage=false \
      -dAntiAliasMonoImage=false \
      -dAutoFilterColorImages=false \
      -dAutoFilterGrayImages=false \
      -dDownsampleColorImages=false \
      -dDownsampleGrayImages=false \
      -dDownsampleMonoImages=false \
      -dColorConversionStrategy=/LeaveColorUnchanged \
      -dConvertCMYKImagesToRGB=false \
      -dConvertImagesToIndexed=false \
      -dUCRandBGInfo=/Preserve \
      -dPreserveHalftoneInfo=true \
      -dPreserveOPIComments=true \
      -dPreserveOverprintSettings=true \
    

所以您可以尝试此命令:

gs                                              \
 -o output.pdf                                  \
 -sDEVICE=pdfwrite                              \
 -dAntiAliasColorImage=false                    \
 -dAntiAliasGrayImage=false                     \
 -dAntiAliasMonoImage=false                     \
 -dAutoFilterColorImages=false                  \
 -dAutoFilterGrayImages=false                   \
 -dDownsampleColorImages=false                  \
 -dDownsampleGrayImages=false                   \
 -dDownsampleMonoImages=false                   \
 -dColorConversionStrategy=/LeaveColorUnchanged \
 -dConvertCMYKImagesToRGB=false                 \
 -dConvertImagesToIndexed=false                 \
 -dUCRandBGInfo=/Preserve                       \
 -dPreserveHalftoneInfo=true                    \
 -dPreserveOPIComments=true                     \
 -dPreserveOverprintSettings=true               \
  input1.pdf                                    \
  input2.pdf

最后,正如克里斯·哈斯(Chris Haas)所暗示的:如果特别是不希望进行任何优化默认情况下适用Ghostscript,那么您也可以使用pdftkpdftk根本无法做这些事情,并且它的相对笨拙会使您获得相当大的速度(但可能比Ghostscript输出的文件大得多)。


0
投票

我在iOS终端上成功使用了以下代码来递归压缩多个PDF。我发布了它是因为我无法通过简单的复制和粘贴找到适合我的东西。

find . -name '*.pdf' | while read pdf; do gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${pdf}_new.pdf" "$pdf"; done

注意,您可能需要不同的输出质量,因此您可以如下更改-dPDFSETTINGS参数:

-dPDFSETTINGS=/screen:质量较低,尺寸较小。-dPDFSETTINGS=/ebook:质量更好,但pdf略大。-dPDFSETTINGS=/prepress:输出类似于Acrobat Distiller的“印前优化”设置。-dPDFSETTINGS=/printer:选择类似于Acrobat Distiller“打印优化”设置的输出。-dPDFSETTINGS=/default:选择旨在广泛使用的输出,可能以较大的输出文件为代价。

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