我正在尝试使用PdfBox实现java pdf-a验证器。我正在处理的文件是一个数字签名的pdf(PADES)。我使用pdfbox或在线工具,结果是:
PreflightDocument document = parser.getPreflightDocument();
document.validate();
1.1 : Header Syntax error, First line must match %PDF-1.d
1.1 : Header Syntax error, Second line must begin with '%' followed by at least 4 bytes greater than 127
1.0 : Syntax error, Missing end of file marker '%%EOF'
但是当我用任何阅读器打开文件时,它的格式确实是pdf-a。 看看pdf内部,实际上第一行不是%PDF-1,也不是最后一个%%EOF。可能,因为 pdf 已签名。难道是?万一,我怎样才能在签名的pdf中克服这种验证?
0ƒ;f *†H†÷
ƒ;V0ƒ;Q10
`†He
ƒ;‡=ƒ;‡8%PDF-1.4
%ÿÿÿÿ
1 0 obj
<<
...
....
.....
注意第 4 行末尾的"%PDF-1.4">
稍微充实了蒂尔曼的评论......
页眉
根据 PDF 规范 ISO 32000-1:
7.5.2 文件头
PDF文件的第一行应是一个标题,由 5 个字符%PDF组成,后跟1.N形式的版本号,其中 N 是 0 到 7 之间的数字。
正如"应"所示,这是一项要求。因此,您的文件不仅不是有效的PDF/A文档,甚至不是有效的PDF。
如果你想知道为什么Adobe Reader不抱怨...Adobe 在附录 H.3 实施说明中的 PDF 1.7 参考中指出,他们的软件对 PDF 标头要求非常宽松:
- Acrobat 查看器仅要求标头出现在文件的前 1024 个字节内的某个位置。
因此,您有一个无效的PDF,Adobe查看器仍然显示。
页脚
再次根据 PDF 规范
7.5.5 文件预告片
PDF 文件的尾部使符合要求的读者能够快速找到交叉引用表和某些特殊对象。符合标准的读者应从其末尾阅读 PDF 文件。文件的最后一行应仅包含文件结束标记 %%EOF。
Adobe查看者再次接受某些不符合此要求的文件;根据 Adobe PDF 参考:
- Acrobat 查看器仅要求 %%EOF 标记出现在文件的最后 1024 个字节内的某个位置。
由于文件的最后一行不是%%EOF,这是它无法满足的有效PDF文件的另一个要求...
关于您的索赔:
但是当我用任何阅读器打开文件时,它的格式确实是pdf-a
Adobe Reader 不会检查文件是否确实是有效的 PDF/A,它只报告文件声称的内容。