使用Ghostscript转换PDF为PDF/A-2b时出现CID 0字体错误如何解决
问题根因
PDF/A规范明确禁止CIDFont使用CID为0的字符位,该编码位在PDF/A标准中为预留未定义位,你所使用的源PDF中包含的Type 1 (CID)字体调用了该非法编码位,因此旧版本Ghostscript会直接放弃PDF/A合规输出。
通用解决方案
1. 优先升级Ghostscript版本
你当前使用的9.25为2018年发布的老旧版本,Ghostscript 9.50及之后的稳定版本针对CID 0的场景新增了自动适配逻辑,可直接规避大部分同类错误,建议先升级到最新的官方稳定版。
2. 调整转换命令参数
在原有命令基础上修改PDFACompatibilityPolicy参数值为3,新增强制全字体嵌入参数,调整后的完整命令如下:
gswin64c -dPDFA=2 -dBATCH -dNOPAUSE -sProcessColorModel=DeviceRGB -sDEVICE=pdfwrite -dPDFACompatibilityPolicy=3 -dEmbedAllFonts=true -sOutputFile=output.pdf PDFA_def.ps cid0.pdf
-dPDFACompatibilityPolicy=3会自动对不符合PDF/A规范的非核心属性做兼容处理,针对CID 0的场景会自动将对应字符映射到合法占位CID,不会直接终止PDF/A输出。
3. 预处理转曲方案(无编辑需求场景适用)
如果上述方案仍报错,可先对源PDF做字体转曲预处理,彻底消除CID字体相关问题,预处理命令如下:
gswin64c -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dNoOutputFonts -sOutputFile=intermediate.pdf cid0.pdf
生成的intermediate.pdf中所有文字已转为矢量路径,无任何字体信息,再使用你的原有PDF/A转换命令处理该中间文件即可,缺点是转换后的文件文字不可选中、编辑。
4. 自定义CID字体映射生效方法
你之前修改cidfmap不生效的原因是未指定自定义配置的加载路径,需要在转换命令中添加-I参数,指向你存放修改后cidfmap文件的目录,自定义映射规则才会被加载。
其他说明
你所使用的在线转换工具仅修改了PDF的文件元数据标记为PDF/A格式,未实际做合规性修正,因此VeraPDF校验不通过是正常现象。
内容的提问来源于stack exchange,提问作者Bob Bings

