合并PDF的Ghostscript压缩结果


69

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

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

生成的大小小于2个PDF的总大小。

使用单个文件作为输入运行命令仍然会导致输出文件的大小减小。

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

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

Answers:


79

当用作设备时,您可以通过以下一些附加选项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

4
感谢您推荐pdftk。对于PDF文件的简单串联,这似乎是完美的。
Jan-Philip Gehrcke博士

1
FWIW: pdftk不可为CentOS / RHEL 7
编码器

1
我碰巧我丢失了页面,并且尺寸增加了10倍gspdftk只需串联即可,无需修改,而且速度更快。
Teresa e Junior

35

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

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

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

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

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

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

现在什么/defaultPDFSETTINGS?您有两种选择可以找出:

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

  2. 查询(您自己的)Ghostscript以获取此设置的详细含义。我对问题“正在查询Ghostscript以获得输出设备的默认选项/设置...”和问题“什么是PostScript字典,以及如何通过Ghostscript访问它们”的回答对此进行详细说明。简而言之,要查询Ghostscript的/defaultPDFSETTINGS详细信息,请运行以下命令:

     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通过添加以下参数,对输入的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)所暗示的那样:pdftk如果您特别不希望Ghostscript默认应用任何优化,则也可以使用。pdftk根本无法执行此类操作,并且由于其相对笨拙的操作,您将获得相当大的速度(但可能比Ghostscript输出的文件大得多)。


1
pdftk自2016
编码器

1
您可以应用其中一项-dPDFSETTINGS=设置,然后-d*稍后在命令行中使用设置(在您的答案中)仅覆盖其中的一部分吗?
CMCDragonkai

1
@CMCDragonkai:是的,可以。(不过,我还没有测试过。但是,如果这没有用,那就是一个错误。)
Kurt Pfeifle

此处提供了pdftk的重新打包版本,该版本可在Centos 7上运行linuxglobal.com/pdftk-works-on-centos-7
Ren

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.