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

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

我有一个已经压缩过且带有一些伪像的 PDF,我正在使用 Ghostscript 为该 PDF 添加一个标题页。

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

我可以在 GS 中提高 DPI 设置,但它会从 5MB 变为 60MB,而仍然看起来更糟。

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

答案1

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

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

这将添加标题.pdf内容.pdf并将结果写入书籍.pdf

pdftk是一种“愚蠢”但非常快速的连接两个(或更多)PDF文件的方法。“愚蠢”的程度,因为pdftk不会以任何方式解释PDF 数据流,它只是确保内部对象编号根据需要重新排列,并出现在 PDFxref结构中(基本上是一种 PDF目录对于对象)。

Ghostscript:

如果您想使用 Ghostscript,连接相同两个文件的基本命令是:

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

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

Ghostscript 创建新的书籍.pdfpdftk比的方法更“智能”(但也慢得多) 。(这也是为什么 Ghostscript 在许多情况下能够在限制范围内“修复”损坏的 PDF 文件,或将未嵌入输入 PDF 的字体嵌入输出 PDF,或删除重复的图像、用简单的引用替换它们等的原因——并且总体上从臃肿的输入 PDF 创建更小、更优化的文件……)

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

这是什么意思“Ghostscript 会‘解释’其 PDF 输入”

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

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

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

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

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

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

-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 的默认设置的完整列表pdf写入设备正在使用,运行以下命令。它会返回满的列表:

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

有关所有这些参数的具体含义,您必须阅读Adobe 关于“Distiller 参数”的文档。Ghostscript 尽力模仿所有这些……

相关内容