2011-11-16 90 views
47

我发现这个整齐命令到多个PDF合并成一个,使用的Ghostscript:Ghostscript的合并的PDF压缩结果

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

所得大小大于2个PDF的组合尺寸更小。

以单个文件作为输入运行该命令仍会导致较小的输出文件。

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

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

回答

53

这里有一些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 
+3

感谢您推荐pdftk。对于简单的PDF文件连接,它似乎是完美的。 –

+1

FWIW:'pdftk'不适用于CentOS/RHEL 7. –

+0

很酷.. !!真的 –

29

一些你观察到的可能来自未使用对象的Ghostscript的清理尺寸优化,其最近收购的字体优化改进(你使用非常近版本的GS?!?)以及可能发生的图像重新/下采样。

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

  1. 读取输入文件(S)与它的所有对象,并将其转换成图形页面的内部格式表示。
  2. 操作在命令行上询问内部格式的页面内容。
  3. 写出一个全新的PDF。

这意味着,对于大多数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的竟有直通模式,因为它可能可以聘请到输入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 

最后,克里斯哈斯人已经暗示:如果您的明确不希望Ghostscript默认应用的任何优化,您也可以使用pdftkpdftk根本无法做到这样的事情,并且由于其相对的操作麻烦(但可能还有比Ghostscript大得多的文件大小输出),您将获得相当大的速度。

+1

从2016年3月起,'pdftk'不可用于CentOS/RHEL 7. –

+1

您可以应用其中一个'-dPDFSETTINGS ='设置,然后用'-d *'设置覆盖它们的一部分(在您的答案中)稍后在命令行? – CMCDragonkai

+1

@CMCDragonkai:是的,你可以。 (虽然我还没有测试过,但如果这不起作用,那将是一个错误。) –