跳到主要内容
PulsarKit

修复后的PDF为什么还是通不过PDF/A验证

修复一个打不开的PDF,和让它达到归档要求,是两套完全不同的标准。通过了其中一项,并不能说明另一项的情况。

作者:PulsarKit · ·

现实中的损坏大多出在结构上,而结构损坏可以修复

现实中绝大多数PDF损坏,比如文件完全打不开,或者打开后出现明显的错误,都归结为交叉引用表损坏或文件尾(trailer)损坏,最常见的原因是下载中断,或者保存到一半时磁盘出了故障。这类损坏完全可以修复。这种情况下,PDF修复要做的只是重建文件的内部结构,文件就能恢复原有的内容,什么也不会丢,因为底层的页面内容从一开始就没有受到影响。坏掉的只是那份告诉阅读器去哪里找内容的索引。阅读器拒绝打开这个文件,是在拒绝按一张坏掉的地图走,而不是在报告页面本身丢了。

页面内容本身受损,是另一类问题

某一页的内容流损坏,和索引损坏是两类不同的问题。这时,那一页的矢量文字和绘图指令已经没有了,不只是难以找到;结构修复做得再多,也无法重建文件里已经不存在的数据。实际的做法是把那一页还能恢复的部分渲染成图片,再用PDF文字识别处理,找回可读的文字。同一份文档里其他没有受损的页面,自始至终保留原来的矢量内容,不受任何影响。

能修复和符合PDF/A是两套不同的标准

一个PDF现在在任何阅读器里都能正常打开,文字清晰,哪里都没有可见的错误,却仍然可能完全通不过PDF/A归档验证,这是PDF转PDF/A要做的另一项工作。PDF/A是另一套严格得多的标准,检查的内容也不同:文件用到的每种字体都必须嵌入,而不是只按名称引用;颜色要绑定到一个声明过的固定配置文件;文件不能依赖任何外部资源,也不能依赖几十年后的读者可能没有的软件。修复损坏的结构,本来就不是为了保证这些。修复和归档合规,回答的是关于同一个文件的两个不同问题。

为什么验证器如实给出的“不通过”比虚假的“通过”更有用

这里不依赖Ghostscript构建PDF/A结构,这是因为它的许可条款而特意避开的。这意味着要直接组装所需的结构,而不是走大多数工具依赖的标准转换路径。所以这是一个尽力而为的过程,不能保证一定成功。每次转换都交给veraPDF检查,它是真正的档案馆和法院所依赖的参考验证器;页面显示的是它的结论,而不是一个让人安心的对勾。这样报告出来的失败,就是真实存在的失败。这比一个工具声称成功、却拿不出依据,要有用得多。

读懂具体的失败项,比把验证只看成通过或不通过更有用

如果验证失败时列出了文档没有满足的具体规则,比如某种字体没有嵌入,或者某个颜色空间没有正确声明,这就是一个有用、可以据此动手的结果,单纯的“通过/不通过”标志永远做不到这一点。不管验证结果如何都下载文件,再读一读哪些规则没通过,这样一份已经完成百分之九十五合规工作的文档,就不会和刚刚起步的文档被同等对待。没通过的规则指出了还需要修复的地方,不必把整份文档从头再处理一遍。

选择修复策略和PDF/A级别

每个工具都会先问一个问题,答错就要白跑一次。PDF修复有三种策略。“自动”是默认策略:它重建结构,只在内容流损坏的页面上退回到图片加文字识别(OCR)。“仅结构”从不这样做:损坏的页面会变成空白页。如果每一个保留下来的页面都必须保有真正可选中的文字,这是更好的选择。“栅格化并识别”把每一页都重画成带识别文字的图片,本来可读的页面也不例外,适合文字显示成乱码的文件。结果页面会列出哪些页面是以图片形式恢复的,所以把文件交给下一步之前,先看一看。

PDF转PDF/A会让你选择级别。2b几乎适合2010年以后制作的任何文件,并且保留透明效果;1b会把任何带透明或图层的页面扁平化成普通图片,现代文件很少需要这样;3b只是多了嵌入另一个文件的权利,比如发票的源电子表格。有两件事比级别更重要:标准禁止加密,所以受保护的文件要先用PDF解密移除密码;扫描件如果不打开文字识别选项,转换后仍然无法搜索。结果通常会大10%到40%:没有嵌入的字体会换成度量兼容的Liberation或Noto字体,颜色则绑定到sRGB。

本文用到的工具

继续阅读