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

时间:2019-05-16 00:46:50

标签: bash ghostscript imagemagick-convert

有没有一种方法可以实现相同的压缩效果(较大的压缩率和质量,但速度较慢,可能会破坏pdf):

pdfimages -tiff $1 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(非单声道)

ghostscript output ghostscript output zoom

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

imagemagick output imagemagick output zoom

1 个答案:

答案 0 :(得分:2)

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

我认为您所指的伪像是由JPEG量化引起的。原始图像已被解压缩,下采样至较低的分辨率,然后重新压缩。由于您没有选择任何其他压缩方法,因此使用/ screen PDFSETTINGS的默认设置,对于灰色和彩色图像,使用JPEG;对于单色图像,使用CCITT传真。

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

我可以提出一些建议;首先,除非您完全确定要执行所有操作,否则请勿使用PDFSETTINGS。通常,我希望通过保留大多数设置并简单地应用所需的开关来获得更好的结果。

鉴于这些都是扫描页面,因此没有必要设置任何与字体有关的参数(除非已添加不可见字体)。

您已经设置了ProcessColorModel两次,一次是名称,一次是字符串。实际上,如果您使用ColorConversionStrategy,则根本不应该设置它;如果您不使用ColorConversionStrategy,则它不会起作用,因此您可以完全删除这两个。

/ Mono没有ColorConversionStratefy,并且尝试设置该设置会导致我出错。在当前版本中,ColorConversionStrategy似乎引入了一个错误。如果设置为灰色,则实际上将获得RGB。为了获得灰色,您实际上需要请求CMYK。显然,这已得到解决,但与此同时,所有空格都“一个个分开”。 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 / p>

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

基本上,就像我刚开始所说的那样,如果您要处理图像数据,最好的方法是使用一种用于处理图像的工具,而不是一种用于呈现PostScript / PDF文件的工具。

您可以通过使用IM似乎已经使用过的随机筛选方法,通过Ghostscript将原始页面渲染为btimap格式,然后将图像读回到Ghostscript中以生成PDF文件,但是看起来几乎像比现在使用IM更加容易。