用于合并PDF的重影脚本会压缩结果

用于合并PDF的重影脚本会压缩结果,pdf,ghostscript,Pdf,Ghostscript,我发现这个简洁的命令可以使用Ghostscript将多个PDF合并为一个: gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf 结果大小小于2个PDF的组合大小 以单个文件作为输入运行该命令仍然会生成较小的输出文件 Ghostscript上是否有一个选项,可以只复制合并时显示的页面,而不进行任何压缩 如果不是,那么Ghostscript压缩是否可能非常好,完全不会导致质量损失 使用pdfw

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

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf
结果大小小于2个PDF的组合大小

以单个文件作为输入运行该命令仍然会生成较小的输出文件

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

如果不是,那么Ghostscript压缩是否可能非常好,完全不会导致质量损失

使用
pdfwrite
作为您的设备时,您可以传递以下信息。根据该页面,如果您没有传递任何内容,则会将其设置为接近于
/screen
,尽管它没有变得更具体。您可以尝试将其设置为
-dPDFSETTINGS=/prepress
,这样只能压缩300 dpi以上的内容

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=out.pdf in1.pdf in2.pdf
另一种选择是:


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

如果用于PDF->PDF转换,则Ghostscript的基本操作如下:

  • 读入输入文件及其所有对象,并将其转换为图形页面表示的内部格式
  • 对内部格式的页面内容执行命令行上要求的操作
  • 写出一份全新的PDF
  • 这意味着对于大多数PDF->PDF操作,PDF对象的顺序和编号都不同,甚至对象的内部代码也可能发生了更改(即使您的眼睛没有发现输入和输出PDF之间的任何差异)

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

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

    现在什么是
    /default
    PDF设置?!您有两个选项可以找到:

  • 阅读手册。大图给出了一个概述。您可以看到,这个
    -dPDFSETTINGS=/default
    本身只是它所代表的几十个其他更具体设置的简写。提供的文档链接是针对当前开发代码负责人的,您实际使用的版本当然可能不同

  • 查询(您自己的)Ghostscript以了解此设置的详细含义。我对问题和问题的回答对此做了详细阐述。简而言之,要查询Ghostscript的
    /default
    PDFSETTINGS详细信息,请运行以下命令:

     gs \
       -q \
       -dNODISPLAY \
       -c ".distillersettings /default get {exch ==only ( ) print ===} forall quit"
    
    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
    
    您应该得到与此非常相似的结果:

      /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
    
  • 因此,您可以尝试以下命令:

     gs \
       -q \
       -dNODISPLAY \
       -c ".distillersettings /default get {exch ==only ( ) print ===} forall quit"
    
    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默认应用的任何优化,也可以使用
    pdftk
    pdftk
    根本无法做这些事情,并且由于其相对简单的操作,您将获得相当大的速度(但可能比Ghostscript输出的文件大得多)

    我在iOS终端上成功地使用了以下代码来递归压缩多个PDF。我把它贴了出来,因为我找不到一个简单的复制和粘贴就适合我的东西

    find-在阅读pdf时命名“*.pdf”;do gs-sDEVICE=pdfwrite-dCompatibilityLevel=1.4-dPDFSETTINGS=/ebook-dNOPAUSE-dQUIET-dBATCH-sOutputFile=“${pdf}\u new.pdf”“$pdf”;完成
    
    注意:您可能需要不同的输出质量,因此可以按如下方式更改
    -dPDFSETTINGS
    参数:

    -dPDFSETTINGS=/screen
    :质量更低,尺寸更小。
    -dPDFSETTINGS=/ebook
    :为了获得更好的质量,但是PDF要稍大一些。
    -dPDFSETTINGS=/prepress
    :输出类似于Acrobat蒸馏器的“印前优化”设置。
    -dPDFSETTINGS=/printer
    :选择类似于Acrobat蒸馏器“打印优化”设置的输出。

    -dPDFSETTINGS=/default
    :选择在各种用途中都有用的输出,可能会以牺牲更大的输出文件为代价。

    感谢推荐pdftk。对于PDF文件的简单连接,它似乎是完美的。FWIW:
    pdftk
    不适用于CentOS/RHEL 7。我碰巧丢失了页面,并且随着
    gs
    的增加,大小增加了10倍
    pdftk
    除了速度快得多之外,只需连接而无需修改。
    pdftk
    自2016年3月起不适用于CentOS/RHEL 7。您能否应用
    -dPDFSETTINGS=
    设置之一,然后仅使用
    -d*
    设置覆盖其中的一个子集(在您的回答中)稍后在命令行?@CMCDRANGKAI:是的,你可以。(虽然我还没有测试过,但如果这不起作用,那就是一个bug。)这里有一个重新打包的pdftk版本,可以在Centos 7上使用