当前位置: 首页 > 知识库问答 >
问题:

将其他页面添加到已签名的pdf并再次签名

景才英
2023-03-14

是否可以在签名的PDF中添加附加页面并在不破坏第一个签名的情况下再次签名。

我在adobe留档中读到增量更新,这可能是可能的。

然而,我不确定这是否适用于所有内容,还是仅适用于注释(注释)、表单填写和数字签名。

我试图通过在Java中使用Apache PDFBox来做到这一点,对文档进行签名,然后加载文档,将页面附加到文档中,使用saveIncremental()保存文档,然后再次签名。

但是,第一个签名会失效。

下面是生成新PDF的generateTest方法:

public byte[] generateTest(InputStream requestPdfIn) throws IOException {

    // Create a document and add a page to it
    // PDDocument document = new PDDocument();
    PDDocument document = PDDocument.load(requestPdfIn);
    PDPage page = new PDPage(PDRectangle.A4);
    document.addPage(page);     

    COSBase item = document.getPages().getCOSObject().getItem(COSName.KIDS);
    ((COSUpdateInfo) item).setNeedToBeUpdated(true);
    COSArray kids = (COSArray) item;
    kids.setNeedToBeUpdated(true);
    ((COSUpdateInfo) kids.get(0)).setNeedToBeUpdated(true);

    document.getPage(0).getCOSObject().setNeedToBeUpdated(true);
    page.getCOSObject().setNeedToBeUpdated(true);
    document.getPages().getCOSObject().setNeedToBeUpdated(true);

    COSDictionary dict = page.getCOSObject();
    while (dict.containsKey(COSName.PARENT)) {
        COSBase parent = dict.getDictionaryObject(COSName.PARENT);
        if (parent instanceof COSDictionary) {
            dict = (COSDictionary) parent;
            dict.setNeedToBeUpdated(true);
        }
    }

    document.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);
    //document.getDocumentCatalog().getStructureTreeRoot().getCOSObject().setNeedToBeUpdated(true);

    // Save the results and ensure that the document is properly closed:
    ByteArrayOutputStream confirmationPdfOut = new ByteArrayOutputStream();
    document.saveIncremental(confirmationPdfOut);
    document.close();

    return confirmationPdfOut.toByteArray();

}

我在这篇文章中发现,所有COSObjects都需要将标志needtoupdate设置为true。

但是,当尝试向文档添加另一个页面时,这仍然没有帮助,因为当我尝试使用Acrobat Reader验证签名时,第一个签名会失效。

有可能吗?PDFBox可以吗?

共有1个答案

淳于昊然
2023-03-14

不,这是不可能的。不允许向已签名的PDF添加页面。

我在adobe留档中读到增量更新,这可能是可能的。

事实上,可以在不接触以前的修订的情况下向PDF添加更改。因此,如果以前的修订被签名,则签名在数学上仍然有效,它仍然签署正确的哈希值。

但是PDF规范及其主要解释(即Adobe)包含额外的限制,参见此堆栈溢出答案。正如您在那里发现的那样,最多允许对签名文档进行以下更改:

  • 添加签名字段

至少Adobe Acrobat(Reader)除了检查数学有效性之外,还测试这些更改,即使许多其他验证服务没有这样做。

因此,无法执行在已签名PDF中添加其他页面并再次签名而不破坏第一个签名的任务。

 类似资料:
  • 印度的《公司法》有一些变化。其中值得注意的是,有一项规定,如果公司进行了数字签名,则可以以电子形式维护其登记册。以下几点让我感到困惑: > 记录一旦以数字方式标注日期和签名,不得编辑或更改; 记录应能够根据法案的规定或根据法案制定的规则进行更新,更新日期应能够记录在每次更新中。 想象一下,我们正在对PDF中的表进行数字签名。如果表中最初有2行,并且用户对pdf进行数字签名。现在,我们在pdf中再添

  • 问题内容: 我想使用Bouncycastle生成一个简单的CMS签名。此代码有效! 但是,如何添加签名属性? 我想删除默认的签名属性并添加signature-policy-identifier。 文章非常受欢迎。 问题答案: 首先,您似乎正在使用最新版本的Bouncy Castle中不推荐使用的构造。要添加经过身份验证/签名的属性,您必须将它们打包到AttributeTable中,将签名的属性添加

  • 对于IText5,添加数字签名相当容易。其留档的链接是:http://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-2 有人可以在ITEXT 7中共享文档链接吗?我试过各种方法,但都没有用。在网上找不到任何链接。我可以取消签名并检查签名,但不能添

  • 然后我用adobe签名并通过以下方式传递: 我真的不明白为什么这不起作用。任何帮助都会很好! 编辑: 按照建议,我已经将添加的注释、页面和注释列表的NeedToBeUpdated标志设置为true(希望最后一个操作正确): 注释仍然没有保存,所以我显然遗漏了一些东西。 编辑3: 但是,当我在adobe Reader中打开文档时,它不会出现。也许这与外观流的关系更大,而不是注释本身?

  • 为什么每次我使用PdfStamper时都会增加签名PDF的大小? 这是我的密码: 如果调用test,则生成的pdf会根据签名信息增加大小: > 我已经测试了调用上面的测试方法与一个简单的唱和每次我调用测试()的结果pdf它每次增加3,5kb(我认为由于小标志信息)。 为什么pdfstamper在我没有添加任何更改的情况下也会增加我的pdf大小?我怎样才能避免呢?390kb这是一个问题,因为我需要放

  • 如何使用Perl中的数字签名对pdf文件进行签名?我能够提取pdf的内容,并生成签名字符串通过 #$Content->要签名的pdf内容