0

我刚刚编写了将文件附加到 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。换句话说,我将另一个文件附加到签署的文件并再次签署)。结果,没有旧文件。新文件覆盖了旧文件(签名也变得无效,因为改变了哈希 - 这是正确的);

因此,我已经完成了从 PDEmbeddedFilesNameTreeNode 获取 oldFiles 并添加到新文件映射的操作。

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);

这样可行。但是当我创建第二个修订版时签名再次无效。我认为,主要问题是,当我将新文件添加到同一个文件 NameDictionary 时,文档的哈希值会发生变化。

所以,我想,我应该在下一个版本中创建新的 NameDictionary,可能是我错了(我不能使用现有的 NameDictionary)。我不明白。我能知道什么?你怎么看?

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

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

这是我的示例文件

4

1 回答 1

2

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

无论你有什么其他问题,你都在尝试这个,这项事业本身已经注定了。即使您将其作为增量更新执行,也不允许对已签名文档执行此操作。

对先前签署的文件所允许的操作要么受到规范的限制(在认证签名的情况下),要么受到认证规则的外推(仅在批准签名的情况下)的限制。

在证书签名(DocMDP签名)的情况下, DocMDP 转换参数字典中的P值选择文档上允许的操作集:

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

1 不得更改文件;对文件的任何更改将使签名无效。

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

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

默认值:2。

( ISO 32000-1中的第 12.8.2.2.2 节)

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

不幸的是,规范没有明确说明如果没有证书签名(DocMDP签名)应允许哪些更改;因此,人们可能会倾向于假设一切都是允许的。

但实际上,当前的 PDF 查看器,尤其是占主导地位的 Adob​​e Reader,假设不同,并推断出一组允许的更改。在 Adob​​e Reader 的情况下,这些(详细信息请参见此答案)与P = 3加上签名字段的DocMDP相同。(假设作者并没有真正考虑签名用例,因此可能忘记添加空签名字段;否则,虽然,允许的更改集被认为是恰当的。)

因此,也没有附加文件。

如果您想处理多个附件和多个签名,您可以考虑通过创建新 PDF、添加原始 PDF 和新文件作为附件来补充已签名的 PDF(并将 enw PDF 设置为默认显示原始 PDF) ,然后对整个构造进行签名。

PS:关于您的实际尝试:在尝试操作已签名的文档DOC-signed.pdf时,您似乎是从使用 PDFBox 读写它开始的;我认为这是因为不是DOC-signed.pdf起始部分,但后一个文档确实包含增量更新中的新附件和第二个签名。DOC-signed-signed.pdf

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

于 2013-08-14T11:08:02.093 回答