带空格的PDF字体名引发打印机错误:修复及预防方案问询
我负责维护一个包含大量未索引科学文献的存档,此前通过扫描纸质文档并做OCR生成可搜索文本,流程一直正常。但学校更换了无OCR功能的打印机后,我改为分开扫描和OCR,用Adobe Acrobat Pro完成OCR。起初运行正常,直到某天发现部分处理后的文档无法通过Mac Preview打印(用Adobe Acrobat打印没问题),Ricoh IM C4500打印机报错:
ERROR: undefined
OFFENSIVE COMMAND: New
STACK:
/AAAAAC+*Times
/FontName
我对PDF了解有限,通过以下步骤复现并验证了问题成因:
- 从Preview打印为PS文件,再用Adobe Distiller重新生成PDF,复现了打印报错
- 手动将PS文件中带空格的字体名替换为连字符形式(如
Times New Roman→Times-New-Roman)后,Distiller可生成正常打印的PDF - 尝试用
pdf2ps+ps2pdf组合处理,无需手动干预即可自动修复问题
目前无法提供最小复现示例,但问题成因已明确,现提出两个技术问题:
- 如何批量修复已存在该问题的大量存档文件?
- 如何在未来避免此类字体名问题?
需要命令行解决方案,已知可用pdffonts获取PDF字体列表,但不清楚如何修改带空格的字体名,推测需重建PDF,希望得到具体建议(比如用GhostScript完成清理)。
1. 批量修复现有文件
方案1:使用GhostScript直接重建PDF
GhostScript可以重新处理PDF,自动标准化字体命名(将带空格的字体名转换为符合PostScript规范的形式),是最直接的批量处理方案。
单文件处理命令:
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=fixed_original.pdf original.pdf
批量处理Bash脚本:
#!/bin/bash # 遍历当前目录下所有PDF文件,生成修复后的文件 for file in *.pdf; do if [[ -f "$file" ]]; then gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile="fixed_${file}" "$file" echo "修复完成:$file → fixed_${file}" fi done
-dPDFSETTINGS=/prepress:保留较高打印质量,适合科学文献存档;若需更小体积,可改为/screen或/ebook- 该命令会自动处理字体名问题,无需手动修改中间文件
方案2:pdf2ps + ps2pdf批量自动化
你已验证过该组合有效,可通过脚本批量执行:
#!/bin/bash for file in *.pdf; do if [[ -f "$file" ]]; then temp_ps="${file%.pdf}_temp.ps" pdf2ps "$file" "$temp_ps" ps2pdf "$temp_ps" "fixed_${file}" rm "$temp_ps" # 删除临时PS文件 echo "修复完成:$file → fixed_${file}" fi done
注意:pdf2ps和ps2pdf是GhostScript附带工具,需确保系统已安装GhostScript。
2. 未来避免此类问题
调整Adobe Acrobat Pro的OCR设置
在Acrobat中做OCR时,修改字体相关设置:
- 打开「识别文本」→「编辑识别选项」
- 在「输出」选项卡中,勾选「嵌入字体」,并确保字体命名采用PostScript兼容格式(用连字符/下划线替代空格)
- 若Acrobat无直接字体命名选项,OCR完成后可使用「优化PDF」工具中的「清理字体」功能,强制标准化字体名
用GhostScript预处理OCR后的PDF
将GhostScript的pdfwrite命令集成到OCR工作流,提前标准化PDF:
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=ocr_fixed.pdf ocr_original.pdf
可通过Mac的Automator或脚本实现自动执行,无需手动操作。
优化打印流程
优先使用Adobe Acrobat直接打印问题PDF;若需用Preview打印,先通过GhostScript预处理PDF再操作。
内容的提问来源于stack exchange,提问作者Tore H-W

