Pdf 第2版中的签名无效-由附件引起

Pdf 第2版中的签名无效-由附件引起,pdf,adobe,digital-signature,acrobat,pdfbox,Pdf,Adobe,Digital Signature,Acrobat,Pdfbox,我刚刚编写了将文件附加到PDF文档的代码。我在PDFBox页面中看到了代码 PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode(); PDComplexFileSpecification fs = new PDComplexFileSpecification(); fs.setFile( "Test.txt" ); InputStream is = ...; PDEmbeddedFile ef = new P

我刚刚编写了将文件附加到PDF文档的代码。我在PDFBox页面中看到了代码

PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();

PDComplexFileSpecification fs = new PDComplexFileSpecification();
fs.setFile( "Test.txt" );
InputStream is = ...;
PDEmbeddedFile ef = new PDEmbeddedFile(doc, is );
ef.setSubtype( "test/plain" );
ef.setSize( data.length );
ef.setCreationDate( new GregorianCalendar() );
fs.setEmbeddedFile( ef );
Map efMap = new HashMap();
efMap.put( "My first attachment", fs );
efTree.setNames( efMap );
PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog() );
names.setEmbeddedFiles( efTree );
doc.getDocumentCatalog().setNames( names );
doc.save("attachedPDF"); 
这很有效

然后,我附上了文件,并签署了文件结果是-一切正常

然后,我得到签名的
文档(有附件),然后用另一个附件对文档进行签名(我创建了修订版2。换句话说,我将另一个文件附加到签名的文档并再次签名)。结果是,没有旧文件。新文件覆盖了旧文件(签名也变得无效,因为更改了哈希-这是正确的)

所以,我这样做是为了从PDEmbeddedFileNameTreeNode获取旧文件并添加到新文件映射

PDEmbeddedFilesNameTreeNode oldFiles=names.getEmbeddedFiles();
        if(oldFiles!=null){
            Map oldFilesMap = oldFiles.getNames();
            Iterator iterator = oldFilesMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry mapEntry = (Map.Entry) iterator.next();
                System.out.println("The key is: " + mapEntry.getKey()+ ",value is :" + mapEntry.getValue());
                efMap.put(mapEntry.getKey(),  mapEntry.getValue());
            }

        }
efTree.setNames(efMap);
这很有效。但当我创建第二次修订时,签名再次无效。 我认为,主要的问题是,当我将新文件添加到同一个文件名字典中时,文档的哈希值会发生变化

因此,我认为,我应该在下一次修订中创建新的名称词典,可能是我错了(我不能使用现有的名称词典)。我不明白。我能知道什么?你觉得怎么样

顺便说一句,我认为这对我来说是不正确的,下一次修订

PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog());
那是

然后,我得到签名的
文档(有附件),然后用另一个附件对文档进行签名(我创建了修订版2。换句话说,我将另一个文件附加到签名的文档并再次签名)

不管你在尝试这项工作时遇到了什么问题,这项工作本身已经注定了。即使是作为增量更新执行,也不允许对已签名文档执行此操作

先前签署的文件上允许的操作受规范限制(如果是认证签名)或根据认证规则推断(仅在批准签名的情况下)

对于认证签名(DocMDP签名),DocMDP转换参数字典中的p值选择文档上允许的操作集:

(可选)为此文档授予的访问权限。有效值应为:

1不允许对文件进行任何更改;对文件的任何更改将使签名无效

2允许的变更应为填写表格、实例化页面模板和签字;其他变更将使签名无效

3允许的变更应与2相同,以及注释的创建、删除和修改;其他变更将使签名无效

默认值:2

(中的第12.8.2.2.2节)

如您所见,附加文件不在其中

不幸的是,规范没有明确说明如果没有认证签名(DocMDP签名),允许进行哪些更改;因此,人们可能会认为一切都是允许的

然而,实际上,当前的PDF浏览器,尤其是占主导地位的Adobe Reader,采用不同的假设并推断出一组允许的更改。如果使用Adobe Reader,则(详情请参见)与DocMDP相同,其中P=3加上添加签名字段。(假设作者没有真正考虑签名用例,因此可能忘记添加空签名字段;否则,允许更改的集合被认为是适当的。)

因此,也没有附加文件

如果您想处理多个附件和多个签名,可以考虑通过创建新的PDF来补充已经签署的PDF,添加原始PDF和新文件作为附件(默认情况下设置EW PDF来显示原始PDF),然后签署整个构造。 PS:关于您的实际尝试:当尝试操作已签名的文档

DOC signed.pdf
,您似乎是从使用PDFBox读写开始的;我认为这是因为
DOC signed.pdf
不是
DOC signed signed.pdf
的起始部分,但后者确实包含新附件和增量更新中的第二个签名


这导致原始文件在内部重新组织,并在过程中破坏原始签名。您应该先创建文件的相同副本,然后添加第二个签名作为增量更新。

据我所知,您的意思是:首先,我必须将附件作为增量更新添加到已签名文档中(这将创建新的PDF文档)。然后将第二个签名作为增量更新添加到文档中。对吗?不,不完全对。首先,将附件添加到已签名的PDF中不起作用,它总是会破坏第一个签名,因为在签名后添加附件从来都不是允许的更改。但即使是这样,你也犯了其他错误,因为你不必要地更改了原始签名文档。最后,你的回答是:如果我在文档上签名并附上附件。无法使用其他附件将第二次修订版2添加到此文档中。(有2个签名的文件,每个版本都有其附件)。我说的对吗?:-)好的,只要您希望原始签名保持有效。在我们进行这项工作时,PAdES第5部分中有一个参考,即DocMDP可用于以后修改嵌入式XML,尽管DocMDP理论上不允许更改嵌入式文件。