Ghostscript合并PDF压缩结果

时间:2011-11-16 20:59:28

标签: pdf ghostscript

我发现这个简洁的命令将多个PDF合并为一个,使用Ghostscript:

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

结果尺寸小于2张PDF的总尺寸。

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

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

如果没有,Ghostscript压缩是否可能如此之好以至于绝对不会导致质量下降?

3 个答案:

答案 0 :(得分:63)

使用pdfwrite作为您的设备时,您可以传递一些additional options。根据该页面,如果你没有传递任何内容,那么-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

答案 1 :(得分:31)

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

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

  1. 读入包含所有对象的输入文件,并将其转换为图形页面表示的内部格式。
  2. 操作在命令行上要求以内部格式对页面内容进行操作。
  3. 写一个全新的PDF。
  4. 这意味着对于大多数 PDF - > PDF 操作您将对PDF对象进行不同的排序和编号,甚至对象的内部代码也可能已更改(即使您的眼睛没有发现输入和输出PDF之间的任何差异)。

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

    现在,对于非常简单的命令行,其中不包含任何操作意愿,Ghostscript 假定您要使用-dPDFSETTINGS=/default,隐式设置此参数并运行相应

    现在 /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 \
      
    3. 所以你可以尝试这个命令:

      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更大的文件大小输出)。

答案 2 :(得分:3)

我在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:选择旨在广泛使用的输出,可能以较大的输出文件为代价。