使用Ghostscript,但告诉它不要重新处理图像吗?


30

我有一个已经压缩过并带有某种伪像图像的PDF,并且我正在使用Ghostscript在该PDF文件的标题页之前添加标题。

但是,我找不到任何方法告诉GS仅使用现有图像而不重新处理它们,现在我感觉好像与GS的工作方式有关,即您无法重新编译/链接PDF而不重新处理其图像。是真的吗?

我可以在GS中提高DPI设置,但它会从5MB增加到60MB,同时看起来仍然更糟。

是否有GS可以替代我需要的更好的替代方法(最好是在OS X上编译)?


您可以编辑问题并引用用于将标题页添加到原始PDF的确切命令行吗?然后我可以告诉您到底要更改或添加到命令行的内容,以便获得更好的图像输出...
Kurt Pfeifle11

我不想让它看起来更好,我想合并而无需重新处理。这将a)产生更好的质量(无损转换),b)不会浪费大量的CPU时间来处理我的1000多个页面文档。
Mahmoud Al-Qudsi'1

1
嘿,您没有回答我的问题,也没有引用您所使用的GS命令行。这意味着:您不会在寻找所需的GS方面获得帮助...
Kurt Pfeifle 2012年

Answers:


44

如果您只想串联两个PDF文件而不对其内容进行任何重新处理,pdftk则适合您。(在Mac OS X上,应该可以通过MacPorts或Fink来使用,对于Linux,所有主要发行版都有本机软件包;对于Windows,请在此处查看。)尝试以下操作:

 pdftk title.pdf content.pdf cat output book.pdf

这会将title.pdf放在content.pdf的前面,并将结果写入book.pdf

pdftk是一种“愚蠢”的但非常快速的串联两个(或更多)PDF文件的方法。“阿呆”,在迄今,因为pdftk不以任何方式解释的PDF数据流,它只是确保在根据需要和出现在PDF中的内部对象号码重新改组xref结构(这基本上是一种PDF的ToC的对对象)。

脚本:

如果要使用Ghostscript,则将相同的两个文件串联的基本命令为:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

但是,按照您的经验,此简单的命令行可能会破坏图像质量。原因是Ghostscript在处理PDF时不是“转储”的:读入时会完全解释它们,写出结果时会创建一个全新的文件。为了创建结果,它将自动使用默认设置来获取整个处理过程中的许多细节。这些默认值将适用于所有其他情况下其调用均未指示Ghostscript的情况。

因此,Ghostscript创建新book.pdf的方法比的方法“更智能”(但也慢得多)pdftk(这也是为什么Ghostscript在许多情况下都可以在一定范围内“修复”损坏的PDF文件,或将字体嵌入未嵌入输入PDF的输出PDF中,或删除重复的图像,从而替换的原因,只需参考等等即可-并根据肿的输入PDF总体上创建了更小,更优化的文件...)

解决方案是不让Ghostscript使用其默认值:通过在命令行中添加更多自定义参数。

“ Ghostscript'解释'其PDF输入”是什么意思?

在再次将生成的PDF及其PDF对象分开之前,所有文件及其内容(对象,流,字体,图像等)均被读取,检查并以其内部表示形式保存。但是,当“吐出”时,Ghostscript会将其所有内部默认设置应用于可用的数百个参数[*]

不幸的是,这会导致您根据这些默认设置对图像进行“重新处理”,只有通过添加自己的(所需)命令行参数才能避免或覆盖这些默认设置。

Ghostscript需要(由于许可问题)将JPEG2000图像重新编码为JPEG编码可能导致图像问题。如果要避免这种情况,请在命令行中添加以下内容:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

要考虑的其他与图像相关的命令行选项包括:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

因此,可能会让您感到高兴的完整Ghostscript命令行应阅读:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

您还可以通过使用以下命令行告诉Ghostscript 不要完全压缩输出PDF中的图像

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf


[*]:
如果您想了解Ghostscript的pdfwrite设备正在使用的默认设置完整列表,请运行以下命令。它会返回完整列表:

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

有关所有这些参数的确切含义的解释,您必须在Adobe文档中阅读有关“ Distiller Parameters”的信息。Ghostscript非常努力地模仿所有这些...


3
(仅供参考)在我的情况下,标志dEncodeColorImagesdEncodeGrayImagesdEncodeMonoImages导致输出文件,成为了很多更大规模的。通过删除它们,文件大小从22MB更改为3.1MB,并且图像质量似乎与使用这些标志完全相同。所有独特的与我使用的标志是:dColorConversionStrategy=/LeaveColorUnchangeddDownsampleMonoImages=falsedDownsampleGrayImages=falsedDownsampleColorImages=falsedAutoFilterColorImages=falsedAutoFilterGrayImages=falsedColorImageFilter=/FlateEncodedGrayImageFilter=/FlateEncode
多尔

@Kurt Pfeifle允许使用哪些选项-dColorImageFilter?我只能找到FlateEncodeDCTEncode。DCT似乎做JPEG(为什么要加密呢?)。我认为由于贝尔实验室关于LZW的专利不再是问题,FLATE到现在已经是图像的过时选择?但是,在花了很多时间搜索之后,我找不到如何使用PNG(或其他任何东西)...我的原始图像是PNG,我希望它们保持不变。我尝试了-c选项,但是它给了我-c can only be used in a built with POSTSCRIPT included....
路易·萨默斯
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.