Java PDF-A文件的验证

Java PDF-A文件的验证,java,validation,pdfbox,pades,Java,Validation,Pdfbox,Pades,我正在尝试使用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 Synt

我正在尝试使用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
<<
...
....
.....
0ƒ;f*†H†÷
 ƒ;V0ƒ;问题10
`†他
 ƒ;‡=ƒ;‡8%PDF-1.4
%ÿÿÿÿ
10 obj
把蒂尔曼的评论充实一点

标题 根据PDF规范ISO 32000-1:

7.5.2文件头 PDF文件的第一行应为标题,由5个字符组成%PDF–,后跟格式为1.N的版本号,其中N是介于0和7之间的数字

如“应”所示,这是一项要求。因此,您的文件不仅不是有效的PDF/a文档,甚至不是有效的PDF

如果你想知道为什么AdobeReader不抱怨。。。Adobe在附录H.3实施说明中的PDF 1.7参考文件中指出,他们的软件对PDF标题的要求非常宽松:

  • Acrobat查看器只要求头显示在文件的前1024字节内的某个位置
  • 因此,您有一个无效的PDF,Adobe Viewer仍会显示该PDF

    页脚 同样根据PDF规范

    7.5.5文件拖车 PDF文件的尾部使合规读者能够快速找到交叉参考表和某些特殊对象。合格的读者应该从末尾阅读PDF文件。文件的最后一行应仅包含文件结束标记,%%EOF

    Adobe查看器再次接受一些不符合此要求的文件;根据Adobe PDF参考资料:

  • Acrobat查看器仅要求%%EOF标记出现在文件最后1024字节的某个位置
  • 由于文件的最后一行不是%%EOF,这是它无法满足的有效PDF文件的另一个要求


    关于你的索赔:

    但是当我用任何阅读器打开文件时,它的格式确实是pdf-a


    Adobe Reader不会检查文件是否为有效的PDF/a,它只报告文件声称的内容。

    与发送该文件的人交谈。PDF文件必须以%PDF开头,而不是以“0ƒ;f*†H†÷V0ƒ;Q10`†Heƒ;‡=ƒ8”开头,即使在签名时也是如此。Re“但是当我用任何阅读器打开文件时,它的格式确实是pdf-a”不,不是。蓝色栏中的文本为“文件声明符合性”。索赔不是事实。