使用GhostScript压缩PDF报错求助:无法在PDF 1.3前使用XRef流
GhostScript压缩PDF报错的原因及解决方法
问题场景
在Windows 10 E系统的CMD/CLI中执行以下GhostScript命令,尝试压缩2010年生成的PDF文件:
gswin64c -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile=${1%.*}.compressed.pdf BOOK1.pdf
执行后出现错误:
GPL Ghostscript 10.03.0: Can't use an XRef stream before PDF 1.5, ignoring WriteXRefStm directive **** Unable to open the initial device, quitting.
报错原因
- XRef流警告:你指定了
-dCompatibilityLevel=1.3,但PDF 1.3标准不支持XRef流(交叉引用流),而GhostScript默认会尝试生成XRef流,因此触发该警告。 - 设备初始化失败:命令中使用了Linux Shell风格的变量替换
${1%.*},Windows CMD不支持这种语法,导致输出文件路径解析失败,进而无法初始化PDF写入设备,这是程序退出的致命原因。
解决方法
1. 修正输出文件路径(核心步骤)
将命令中的${1%.*}.compressed.pdf替换为Windows CMD支持的写法:
- 仅处理单个文件(如
BOOK1.pdf)时,直接写死输出文件名:BOOK1.compressed.pdf - 需要通用处理时,通过CMD变量替换实现:先定义输入文件变量
set "input=BOOK1.pdf",输出路径使用%input:.pdf=.compressed.pdf%
2. 解决XRef流警告
根据PDF兼容性需求选择以下任一方案:
方案A:保持PDF 1.3兼容
添加-dNOOUTPUTERSCHEMA参数,强制GhostScript不使用XRef流,适配PDF 1.3标准:
gswin64c -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dNOOUTPUTERSCHEMA -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile=BOOK1.compressed.pdf BOOK1.pdf
方案B:升级PDF兼容性版本
如果不需要严格兼容PDF 1.3,将-dCompatibilityLevel=1.3改为-dCompatibilityLevel=1.5及以上(PDF 1.5及以后支持XRef流),即可消除警告:
gswin64c -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile=BOOK1.compressed.pdf BOOK1.pdf
3. 批量处理脚本示例
需要批量处理多个PDF文件时,可编写CMD脚本:
@echo off for %%f in (*.pdf) do ( gswin64c -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dNOOUTPUTERSCHEMA -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile="%%~nf.compressed.pdf" "%%f" )
内容的提问来源于stack exchange,提问作者user1597990
相关产品推荐
相关产品推荐

