如何通过Ghostscript转换PDF使内部图片采用CCITT编码
需求实现可行性
该需求完全可以通过Ghostscript实现,它同时支持PDF内彩色/灰度图像转二值黑白、CCITT Group 4和JBIG2两种压缩编码输出,是处理这类需求的首选CLI工具。
Ghostscript具体操作方法
方案一:CCITT Group 4编码(全兼容)
CCITT Group 4是通用黑白文档编码标准,所有PDF阅读器都支持,适合需要兼容老旧设备/软件的场景,操作命令如下:
gs -sDEVICE=pdfwrite \ -dNOPAUSE -dBATCH -dQUIET \ -sProcessColorModel=DeviceGray \ -sColorConversionStrategy=Gray \ -dOverrideICC \ -dThreshold=128 \ -dEncodeColorImages=false \ -dEncodeGrayImages=true \ -dGrayImageFilter=/CCITTFaxEncode \ -dGrayImageDict<< /K -1 /BlackIs1 true /Columns 1728 /Rows 0 >> \ -sOutputFile=output_compressed.pdf input.pdf
参数说明:
-sColorConversionStrategy=Gray:强制将所有彩色内容转换为灰度-dThreshold=128:灰度转二值黑白的阈值,可根据实际画面效果在0~255之间调整,数值越高转出来的画面越亮/K -1:指定使用CCITT Group 4编码,若改为/K 0则使用CCITT Group 3编码
方案二:JBIG2编码(高压缩率)
JBIG2的压缩率比CCITT Group 4高30%~50%,适合追求极致体积的场景,仅Ghostscript 9.50及以上版本原生支持,操作命令如下:
gs -sDEVICE=pdfwrite \ -dNOPAUSE -dBATCH -dQUIET \ -sProcessColorModel=DeviceGray \ -sColorConversionStrategy=Gray \ -dOverrideICC \ -dThreshold=128 \ -dEncodeColorImages=false \ -dEncodeGrayImages=true \ -dGrayImageFilter=/JBIG2Encode \ -dGrayImageDict<< /JBIG2Lossless true >> \ -sOutputFile=output_compressed.pdf input.pdf
参数说明:
- 将
/JBIG2Lossless改为false可开启有损压缩,体积会进一步缩小,文字类内容损失几乎不可感知
替代CLI工具
如果Ghostscript的转码效果不符合预期,可以使用以下工具组合实现需求:
jbig2enc + img2pdf + pdftocairo:先用pdftocairo将PDF每页导出为灰度图像,再用jbig2enc做精细化二值化和编码,最后用img2pdf重新封装为PDF,二值化效果和压缩率都比Ghostscript默认配置更高QPDF:可配合Ghostscript做后处理,移除PDF内冗余的元数据、未使用的内嵌字体、空白对象,还可以线性化优化提升加载速度,补充操作命令:qpdf --linearize --object-streams=generate output_compressed.pdf output_final.pdf
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

