我发现这个巧妙的命令可以使用Ghostscript将多个PDF合并为一个:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf
结果大小小于2个PDF的总大小。
使用单个文件作为输入运行命令仍会生成较小尺寸的输出文件。
Ghostscript上是否有一个选项可以仅复制合并时显示的页面而不进行任何压缩?
如果不是,那么Ghostscript压缩是否有可能会如此好,以至于绝对不会导致质量损失?
以下是使用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
您观察到的某些大小优化可能来自Ghostscript清理未使用的对象,其最近获得的字体优化改进(您使用的是GS的最新版本吗?!?)以及可能对图像进行重新采样/降采样可能发生过。
Ghostscript,如果用于PDF-> PDF转换,则基本上是这样的:
这意味着对于大多数PDF-> PDF操作,PDF对象将具有不同的顺序和编号,甚至对象的内部代码也可能已更改(即使您的眼睛没有发现两者之间的任何区别)输入和输出PDF)。
默认情况下,Ghostscript还将压缩在原始文件中未压缩的任何对象流(但这是无损压缩)。
现在您的命令行非常简单它不包含任何操作希望,您要使用-dPDFSETTINGS=/default
的Ghostscript 假定,隐式设置此参数并相应地进行操作。
现在做什么是/default
PDFSETTINGS ?!您有两种选择可以找到:
阅读手册。大的table in middle of this section给出了概述。您可以看到,此-dPDFSETTINGS=/default
本身只是它代表的其他几十个更具体设置的简写。给定文档的链接适用于开发代码的当前HEAD 当然,您实际使用的版本可能会有所不同。
向您自己的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,那么您也可以使用pdftk
。 pdftk
根本无法做这些事情,并且它的相对笨拙会使您获得相当大的速度(但可能比Ghostscript输出的文件大得多)。
我在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
:选择旨在广泛使用的输出,可能以较大的输出文件为代价。