我有一个已经压缩过且带有一些伪像的 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 尽力模仿所有这些……