Ghostscript pdfwrite 如何指定 JPEG 质量?

8

我正在尝试连接多个PDF文件,这些文件基本上是包含JPG图像的照片书页面。对于我的输出PDF文件,我希望调整图像分辨率为300 DPI,并保持最佳质量。我使用的命令是:

gswin64c.exe -dNOPAUSE -dBATCH ^-dDownsampleColorImages=true -dColorImageResolution=300 ^-dDownsampleGrayImages=true -dGrayImageResolution=300 ^-dDownsampleMonoImages=true -dMonoImageResolution=300 ^-sDEVICE=pdfwrite -dJPEGQ=100 -sOutputFile=out.pdf in1.pdf in2.pdf

然而,似乎-dJPEGQ = 100对输出没有影响。更改此参数会导致相同的文件大小,并且所有值的图像中都可见伪影。使用选项-dPDFSETTINGS = / printer运行命令会获得更好的结果,没有伪影,但是该选项也应该产生300 dpi的结果。那么,指定输出文件中jpg图像的质量的正确命令是什么?

1
基本答案是“不要使用JPEG”。JPEG是一种有损压缩方法,多个应用程序往往会相互干扰,进一步降低质量。如果原始文件是JPEG,则在输出时强制使用Flate压缩而不是DCT(JPEG)。 “JPEGQ”开关特定于JPEG设备(如文档中所述),因此在pdfwrite设备上没有任何效果。您可以调整DCT编码,但需要使用PostScript来调整DCTEncode过滤器。如果您想这样做,请参阅PostScript语言参考手册。 - KenS
这是一个完全有效的答案,我认为 @KenS - Stefan Hegny
2
嘿,非常感谢您的回答!它让我更深入地了解了问题,并通过-dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode强制进行了Flate压缩。然而,印刷店不喜欢输出大小。因此,我使用以下命令调整了DCTEncode过滤器: gswin64c.exe -sOutputFile=out.pdf -dNOPAUSE -dBATCH ^-sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -c ".setpdfwrite << /ColorACSImageDict << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.08 /Blend 1 >> /ColorImageDownsampleType /Bicubic /ColorConversionStrategy /LeaveColorUnchanged >> setdistillerparams" -f in1.pdf - tribol
@tribol,你能把你的解决方案转化为一个答案吗?我想这样会提高可读性并帮助很多人(包括我自己)。 :) - twigmac
太好了!听到它对其他人也有用很棒;) 我现在把它变成了一个答案。 - tribol
显示剩余2条评论
2个回答

7
解决方案是使用以下命令调整DCTEncode过滤器:
gswin64c.exe -sOutputFile=out.pdf -dNOPAUSE -dBATCH ^-sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -c "<< /ColorACSImageDict << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.08 /Blend 1 >> /ColorImageDownsampleType /Bicubic /ColorConversionStrategy /LeaveColorUnchanged >> setdistillerparams" -f in1.pdf

这使得我能够获得压缩文件,质量令人满意,并且可以根据每个人的需求进行调整。

编辑:

.setpdfwrite 参数在最新的 ghostscript 发布版本(>9.50)中已弃用,因此在答案中已将其删除。


2
这个命令中的“-c ".setpdfwrite ..."部分似乎对我没有任何控制作用。压缩来自于“-dPDFSETTINGS=/prepress”。 - Alec Jacobson
1
根据ghostscript(注9),印前ACS图像参数字典为:<< /QFactor 0.15 /Blend 1 /ColorTransform 1 /HSamples [1 1 1 1] /VSamples [1 1 1 1] >>,因此我注意到QFactor为0.15与0.08的差异很大。文件大小是否有所不同? - tribol

0
Ghostscript似乎在某些文件的-c "..."部分中读取/QFactor时存在问题。我尝试使用这个最简命令来测试由pdflatex生成的pdf文件:
gs -sDEVICE=pdfwrite -sOutputFile=output.pdf \
    -dCompatibilityLevel=1.7 -dNOPAUSE -dBATCH \
    -c '<< /ColorACSImageDict << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.15 /Blend 1 /ColorTransform 1 >> >> setdistillerparams ' \
    -f input.pdf

我发现无论指定了什么/QFactor值,输出的output.pdf文件大小和图像质量都是一样的。我认为它仍然使用的是默认的/QFactor值,即0.9。
所以我认为指定pdfwrite的JPEG质量的唯一方法是使用预定义的-dPDFSETTINGS来设置一些QFactor值,并使用其他标志来覆盖其他设置。默认、电子书、打印机和印前的QFactor值分别为0.9、0.76、0.4和0.15。请参阅gs文档:https://www.ghostscript.com/~chrisl/staging/ghostpdl/doc/_build/VectorDevices.html 以下是我用于PDF工作流程的设置。(0.25的QFactor实际上不起作用):
DPI=600
gs -sDEVICE=pdfwrite -sOutputFile=output.pdf \
    -dCompatibilityLevel=1.7 -dFastWebView=true \
    -dEmbedAllFonts=true -dSubsetFonts=true -dCompressFonts=true \
    -dDetectDuplicateImages=true -dDoThumbnails=false -dAutoRotatePages=/None \
    -r$DPI -dColorImageResolution=$DPI -dGrayImageResolution=$DPI -dMonoImageResolution=$DPI \
    -dDownsampleColorImages=true -dColorImageDownsampleType=/Bicubic -dColorImageDownsampleThreshold=1.0 \
    -dDownsampleGrayImages=true -dGrayImageDownsampleType=/Bicubic -dGrayImageDownsampleThreshold=1.0 \
    -dDownsampleMonoImages=true -dMonoImageDownsampleType=/Subsample -dMonoImageDownsampleThreshold=1.0 \
    -dColorImageFilter=/DCTEncode -dGrayImageFilter=/DCTEncode -dMonoImageFilter=/CCITTFaxEncode \
    -dColorConversionStrategy=/LeaveColorUnchanged -dPassThroughJPEGImages=true \
    -dUseArtBox -dNEWPDF=true -dNOPAUSE -dBATCH -dSAFER \
    -dPDFSETTINGS=/printer \
    -c '<< /ColorACSImageDict << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.15 /Blend 1 /ColorTransform 1 >> >> setdistillerparams ' \
    -f input.pdf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接