我有一个已经压缩过并带有某种伪像图像的PDF,并且我正在使用Ghostscript在该PDF文件的标题页之前添加标题。
但是,我找不到任何方法告诉GS仅使用现有图像而不重新处理它们,现在我感觉好像与GS的工作方式有关,即您无法重新编译/链接PDF而不重新处理其图像。是真的吗?
我可以在GS中提高DPI设置,但它会从5MB增加到60MB,同时看起来仍然更糟。
是否有GS可以替代我需要的更好的替代方法(最好是在OS X上编译)?
我有一个已经压缩过并带有某种伪像图像的PDF,并且我正在使用Ghostscript在该PDF文件的标题页之前添加标题。
但是,我找不到任何方法告诉GS仅使用现有图像而不重新处理它们,现在我感觉好像与GS的工作方式有关,即您无法重新编译/链接PDF而不重新处理其图像。是真的吗?
我可以在GS中提高DPI设置,但它会从5MB增加到60MB,同时看起来仍然更糟。
是否有GS可以替代我需要的更好的替代方法(最好是在OS X上编译)?
Answers:
如果您只想串联两个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非常努力地模仿所有这些...
dEncodeColorImages
,dEncodeGrayImages
,dEncodeMonoImages
导致输出文件,成为了很多更大规模的。通过删除它们,文件大小从22MB更改为3.1MB,并且图像质量似乎与使用这些标志完全相同。所有独特的与我使用的标志是:dColorConversionStrategy=/LeaveColorUnchanged
,dDownsampleMonoImages=false
,dDownsampleGrayImages=false
,dDownsampleColorImages=false
,dAutoFilterColorImages=false
,dAutoFilterGrayImages=false
,dColorImageFilter=/FlateEncode
,dGrayImageFilter=/FlateEncode
-dColorImageFilter
?我只能找到FlateEncode
和DCTEncode
。DCT似乎做JPEG(为什么要加密呢?)。我认为由于贝尔实验室关于LZW的专利不再是问题,FLATE到现在已经是图像的过时选择?但是,在花了很多时间搜索之后,我找不到如何使用PNG(或其他任何东西)...我的原始图像是PNG,我希望它们保持不变。我尝试了-c选项,但是它给了我-c can only be used in a built with POSTSCRIPT included.
...