我正在尝试使用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
<<
...
....
.....
注意&#34;%PDF-1.4&#34;在第4行的末尾
答案 0 :(得分:1)
充实了蒂尔曼的评论......
根据PDF规范ISO 32000-1:
7.5.2文件头
PDF文件的第一行应为标题,其中包含5个字符%PDF - ,后跟 1.N格式的版本号,其中N是0到7之间的数字。
正如'应'所示,这是一项要求。因此,您的文件不仅不是有效的PDF / A文档,甚至不是有效的PDF文件。
如果您想知道为什么Adobe Reader不会抱怨... Adobe在他们的PDF 1.7附件H.3参考中的实施说明表明他们的软件对PDF标题要求的处理非常宽松:
- Acrobat查看器只需要标题出现在文件的前1024个字节内的某个位置。
醇>
因此,您有一个Adobe观众无法显示的无效PDF。
再次根据PDF规范
7.5.5文件预告片
PDF文件的预告片使符合本标准的阅读器能够快速找到交叉引用表和某些特殊对象。合规读者应从其末尾阅读PDF文件。文件的最后一行应仅包含文件结束标记 %% EOF 。
Adobe观众再次接受一些不符合此要求的文件;根据Adobe PDF参考:
- Acrobat查看器只需要%% EOF标记出现在文件的最后1024个字节的某处。
醇>
由于您文件的最后一行不是%% EOF,这是无法满足的有效PDF文件的另一个要求......
关于你的主张:
但是当我用任何阅读器打开文件时,它的格式确实是pdf-a
Adobe Reader不会检查文件是否有效PDF / A,它只会报告声称的文件。