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

Mah*_*dsi 34 pdf ghostscript pdftk

我有一个已经压缩过的 PDF 和一些人工图像,我正在使用 Ghostscript 为该 PDF 添加一个标题页。

但是,我找不到任何方法告诉 GS 按原样使用现有图像而不重新处理它们,现在我觉得这与 GS 的工作方式有关,即您无法重新编译/链接 PDF没有重新处理它的图像..是真的吗?

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

有没有更好的替代 GS 可以满足我的需要(最好是在 OS X 上编译)?

Kur*_*fle 51

如果您只想连接两个 PDF 文件而不对其内容进行任何重新处理,pdftk则适合您。(在 Mac OS X 上,这应该可以通过 MacPorts 或 Fink 获得,对于 Linux,所有主要发行版都有本机包;对于 Windows,请看这里。)试试这个:

 pdftk title.pdf content.pdf cat output book.pdf
Run Code Online (Sandbox Code Playgroud)

这会将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
Run Code Online (Sandbox Code Playgroud)

但是,正如您所经历的,这个简单的命令行可能会破坏您的图像质量。原因是 Ghostscript 在处理 PDF 时不是“愚蠢的”:它在读入时完全解释它们,并在写出结果时创建一个全新的文件。为了创建结果,它会自动对整个处理中的许多细节使用默认设置。这些默认值将适用于其调用未以其他方式指示 Ghostscript 的所有情况。

因此,Ghostscript 创建新book.pdf的方法比 的方法更“智能”(但也慢得多)pdftk(这也是为什么 Ghostscript 在很多情况下能够——在限制范围内——“修复”b0rken PDF 文件,或将字体嵌入到未嵌入输入 PDF 的输出 PDF 中,或删除重复图像,替换的原因他们仅仅通过引用等方式——并且总体上从臃肿的输入 PDF 中创建了更小、更好优化的文件......)

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

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

所有文件及其内容(对象、流、字体、图像等)都被读入、检查并保存在其自己的内部表示中,然后再次将生成的 PDF 及其 PDF 对象吐出。但是,当“吐出”时,Ghostscript 将应用其所有可用参数[*] 的所有内部默认设置。

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

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

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \
Run Code Online (Sandbox Code Playgroud)

请注意,以上/FlateEncode意味着输入 PDF 文件中包含的任何 JPEG 流都将转换为原始 (PPM) 流。这将大大增加您生成的 PDF 文件。

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

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \
Run Code Online (Sandbox Code Playgroud)

因此,可以让您开心的完整 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
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令行告诉 Ghostscript不要在输出 PDF 中压缩图像

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf
Run Code Online (Sandbox Code Playgroud)

.


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

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

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

  • (仅供参考)在我的情况下,标志`dEncodeColorImages`、`dEncodeGrayImages`、`dEncodeMonoImages` 导致输出文件变得更大。删除它们后,文件大小从 22MB 变为 3.1MB,图像质量看起来与使用这些标志完全一样。我使用的所有*独特*标志是:`dColorConversionStrategy=/LeaveColorUnchanged`、`dDownsampleMonoImages=false`、`dDownsampleGrayImages=false`、`dDownsampleColorImages=false`、`dAutoFilterColorImages=false`、`dAutoFilterGrayImages=false`、`dColorImageFilter =/FlateEncode`, `dGrayImageFilter=/FlateEncode` (3认同)