使用Ghostscript压缩PDF后文件体积反而增大问题咨询
原因分析
- 原PDF已使用更高压缩效率的算法:Ghostscript
/printer预设默认采用普通JPEG压缩彩色图像、CCITT G4压缩二值图像,若原PDF已经使用了JBIG2、JPEG2000等压缩率更高的算法,重新编码后反而会导致体积上升。 - 强制降级PDF版本导致兼容开销:你的代码固定了
-dCompatibilityLevel=1.4,如果原PDF版本高于1.4,高版本支持的高级压缩特性、对象复用逻辑会为了兼容1.4被拆解,部分原本共享的资源会被重复写入,最终体积增大。 - 无意义的重编码开销:如果原PDF已经完成了字体子集化、图像压缩、冗余资源清理,Ghostscript的处理流程会先解压所有资源流,再按照
/printer的配置重新压缩,若原资源的压缩率高于预设的压缩参数,重编码后体积就会变大。如果原PDF以矢量内容为主,/printer预设还可能额外写入打印相关元数据、展开部分矢量路径,进一步增大体积。 - 缺失冗余清理参数:你当前使用的参数没有开启重复资源清理、无用元数据删除的配置,Ghostscript处理过程中还会新增自身的处理标识元数据,反而增加额外体积。
解决思路
- 调整兼容等级配置:不要固定写死
-dCompatibilityLevel=1.4,可优先检测原PDF的版本,采用和原文件一致的兼容等级,仅在有明确兼容需求时再降级到1.4。 - 补充优化参数:在现有参数基础上增加冗余清理、资源压缩的配置,示例参数如下:
如果确认原图像已经满足清晰度要求,还可以增加-dCompressFonts=true -dSubsetFonts=true -dDoThumbnails=false -dCompressStreams=true-dDownsampleColorImages=false-dDownsampleGrayImages=false-dDownsampleMonoImages=false禁止不必要的图像重采样。 - 灵活选择压缩预设:不要固定使用
/printer预设,可根据原PDF的内容类型选择:如果以文字、矢量为主可选择/ebook预设,仅对打印清晰度有要求时再用/printer预设。 - 增加结果校验逻辑:压缩完成后对比输入输出文件的大小,如果输出文件体积大于原文件,直接保留原文件即可。
- 升级Ghostscript版本:旧版本的
pdfwrite设备存在已知的压缩效率异常问题,升级到官方最新稳定版可以解决部分异常增大的情况。
代码优化示例
你可以参考如下方式调整参数拼接逻辑:
private bool CompressPDF(string Input, string Output, string CompressValue) { try { Process proc = new Process(); ProcessStartInfo psi = new ProcessStartInfo(); psi.CreateNoWindow = true; psi.ErrorDialog = false; psi.UseShellExecute = false; psi.WindowStyle = ProcessWindowStyle.Hidden; psi.FileName = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "ghost.exe"); // 补充优化参数 string args = $"-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/{CompressValue} " + "-dNOPAUSE -dQUIET -dBATCH -dCompressFonts=true -dSubsetFonts=true -dDoThumbnails=false " + $"-sOutputFile=\"{Output}\" \"{Input}\""; psi.Arguments = args; proc.StartInfo = psi; proc.Start(); proc.WaitForExit(); // 新增体积校验 FileInfo inputInfo = new FileInfo(Input); FileInfo outputInfo = new FileInfo(Output); if (outputInfo.Length > inputInfo.Length) { File.Copy(Input, Output, true); } return true; } catch { return false; } }
内容的提问来源于stack exchange,提问作者user1676729
相关产品推荐
相关产品推荐

