使用 ghostscript 实现与 imagemagick 转换相同的 PDF 压缩

Achieving same PDF compression as imagemagick's convert using ghostscript

有没有办法实现与(压缩率和质量很好,但速度很慢并且会破坏 pdf)相同的压缩:

pdfimages -tiff  pdf_images
convert pdf_images-* -alpha off -monochrome -compress Group4 -density 250 ${1%.pdf}.compressed.pdf
rm pdf_images-*

仅使用 ghostscript 代替?

尝试过 dPDFSETTINGSdGrayImageDownsampleTypesColorConversionStrategy,但结果通常质量较低或尺寸较大。

PDF 包含扫描页面(每页一张图像)

我通常在 GS 中使用类似以下内容(仍然缺少一些内容,因为图像未转换...这是设计使然吗?):

gs \
    -q \
    -dNOPAUSE \
    -dBATCH \
    -dSAFER \
    -sDEVICE=pdfwrite \
    -dPDFSETTINGS=/screen \
    -dEmbedAllFonts=false \
    -dSubsetFonts=false \
    -dGrayImageDownsampleType=/Bicubic \
    -dGrayImageResolution=250 \
    -dMonoImageDownsampleType=/Bicubic \
    -dMonoImageResolution=250 \
    -sProcessColorModel=DeviceGray \
    -dProcessColorModel=/DeviceGray \
    -sColorConversionStrategy=/Mono \
    -dOverrideICC \
    -sOutputFile=output.pdf \
    input.pdf

来自 Google 的随机 PDF 样本:https://www.2ndcollege.com/colleges/gcet/btech/sem5/ic/socio/notes/unit1.pdf

原版:5.6MB

GS:1.4MB(非单声道)

PDFImages + ImageMagick:1.4MB(仅转换图像)

添加为答案,因为评论太长了。

我认为您提到的伪像是由 JPEG 量化造成的。原始图像已经过解压、降采样到较低分辨率,然后重新压缩。由于您没有选择任何其他压缩方法,因此使用 /screen PDFSETTINGS 的默认值,灰色和彩色图像为 JPEG,黑白图像为 CCITT Fax。

您可以通过使用不同的压缩过滤器轻松避免这种情况,当然这不会对输出产生那么大的压缩。

我可以提出几个建议;首先不要使用 PDFSETTINGS 除非你完全确定你想要它正在做的所有事情。总的来说,我希望通过保留大多数设置并简单地应用您需要的开关来获得更好的结果。

鉴于这些是扫描的页面,设置任何与字体相关的参数都没有意义(除非添加了不可见字体)。

您已经设置了两次 ProcessColorModel,一次作为名称,一次作为字符串。事实上,如果你使用ColorConversionStrategy,你根本不应该设置它,如果你不使用ColorConversionStrategy那么它不会有任何效果,所以你可以完全放弃这两个。

/Mono 没有 ColorConversionStratefy,我尝试设置它会导致错误。当前版本中的 ColorConversionStrategy 似乎引入了一个错误。如果您设置 Gray,您实际上将获得 RGB。为了获得灰色,您实际上需要请求 CMYK。显然,这已得到修复,但与此同时,所有空格都是 'off by one'。 sRGB->CMYK,CMYK->灰色和灰色->RGB。 LeaveColorUnchanged 不受影响。

当然,这意味着您对灰色和单色图像参数的设置无效(至少对彩色图像无效)。这就是为什么你得到一个低输出大小,也是为什么结果被大量下采样和量化的原因。

现在,正如我已经说过的,您无法让 Ghostscript 的 pdfwrite 生成单色输出,只能生成灰度。我相信,将图像数据减少 8 到 24 倍是大部分收益的来源。所以坦率地说,如果不对图像进行大量下采样,您就无法使用 pdfwrite 降低到相同的输出大小。如果你这样做,那么质量就会受到影响。

此命令行:

\ghostpdl\debugbin\gswin32c -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf -sColorConversionStrategy=CMYK -dPDFSETTINGS=/screen -dGrayImageDownsampleType=/Bicubic -dGrayImageFilter=/FlateEncode -dAutoFilterGrayImages=false unit1.pdf

生成一个 2.1 MB 大小的灰色输出文件,但极端的下采样导致输出非常模糊,我认为你根本不会喜欢它。您可以更改下采样量,但这当然会导致输出文件更大。您可以保持压缩过滤器不变 (DCTEncode == JPEG),但这会让您产生压缩伪像。

基本上,正如我在开头所说的那样,如果您想操作图像数据,最好的方法是使用一种旨在操作图像的工具,而不是一种旨在呈现 PostScript/PDF 文件的工具。

您可以通过一些努力将原始页面渲染为 Ghostscript 的 btimap 格式,使用 IM 似乎使用的随机筛选方法,然后将图像读回 Ghostscript 以生成 PDF 文件,但这很难似乎比现在使用 IM 更容易。