如何修复Ghostscript检测到的旧PDF文件标记错误?
修复旧PDF标记错误导致的Ghostscript转换文本缺失问题
问题背景
使用Ghostscript v9.56.1转换Acrobat Distiller 3.0生成的旧PDF时,出现以下问题:
- 页码丢失
- PDF第22、58页(手册标注第20、56页)的Bank Gothic Light全页文本消失
- 添加
-dPDFSTOPONERROR后检测到PDF标记错误:error executing PDF token、encountered more q than Q、invalid operator used in text block、BT found inside a text block
原执行命令:
gs -sFONTMAP=/full/path/to/font-map.gs -sFONTPATH=/Users/admin/Library/Fonts -sDEVICE=pdfwrite -o Trilogy_Manual-fixed.pdf Trilogy_Manual.pdf
字体映射文件内容:
/BankGothicBT-Medium /BankGothic-Medium ; /ZapfDingbats /ZapfDingbatsITC ; /Futura-ExtraBold /Futura-Bold ;
修复方案
1. 用Ghostscript内置修复模式预处理PDF
先通过Ghostscript的主动修复参数生成结构更规范的PDF,再执行字体映射转换:
gs -sDEVICE=pdfwrite -o pre-repaired.pdf -dPDFSETTINGS=/prepress -dREPAIRPDF=true Trilogy_Manual.pdf
之后对pre-repaired.pdf运行原字体映射命令,可规避大部分旧PDF的结构错误。
2. 调整Ghostscript参数增强容错性
修改原命令,添加容错参数忽略非致命错误:
gs -sFONTMAP=/full/path/to/font-map.gs -sFONTPATH=/Users/admin/Library/Fonts \ -sDEVICE=pdfwrite -o Trilogy_Manual-fixed.pdf \ -dPDFSTOPONERROR=false -dNO_PDFERRORS=true -dALLOWPSTRANSPARENCY=false \ Trilogy_Manual.pdf
-dNO_PDFERRORS=true:强制忽略PDF规范中的非致命错误-dALLOWPSTRANSPARENCY=false:禁用PS透明层处理,避免旧PDF的兼容问题-dPDFSTOPONERROR=false:允许处理继续,不会因非致命错误终止
3. 补全字体映射(排除字体缺失影响)
虽然怀疑是标记问题,但缺失的Bank Gothic Light未在映射文件中定义,可能加剧渲染问题,在font-map.gs中添加一行:
/BankGothicBT-Light /BankGothic-Light ;
确保/Users/admin/Library/Fonts目录下存在对应的BankGothic-Light字体文件。
4. 用pdftk修复PDF结构
如果安装了pdftk,先通过它重新整理PDF内部结构:
pdftk Trilogy_Manual.pdf output pdftk-repaired.pdf
再对pdftk-repaired.pdf执行Ghostscript字体映射命令,pdftk能修复很多低级的PDF语法错误。
5. 尝试降级Ghostscript版本
新版本Ghostscript对旧PDF的兼容性可能不如旧版本,尝试降级到v9.2x或v9.4x系列,这些版本对Distiller 3.0生成的PDF容错性更好。
内容的提问来源于stack exchange,提问作者user1134918
相关产品推荐
相关产品推荐

