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

PDFBox 2.0创建签名字段并使用已签名的文档保存增量

孙成化
2023-03-14

我在这里读到了关于saveIncremental是如何工作的,我的最终结果需要类似于这里,我已经成功地基于签名字段本身创建了具有多重可视化的可见签名(与响应中的情况不同,但响应对我帮助很大)。为了详细说明标题,我目前的基本任务是在已经签名的文档上创建一个空签名字段,而不中断现有签名。但是,这里的示例不适用于saveIncremental。我在主函数的末尾添加了以下片段(改编),但没有结果:

    acroForm.setSignaturesExist(true);
    acroForm.setAppendOnly(true);
    acroForm.getCOSObject().setDirect(true);
// ...


COSDictionary pageTreeObject = pdPage.getCOSObject(); 
while (pageTreeObject != null) {
    pageTreeObject.setNeedToBeUpdated(true);
    pageTreeObject = (COSDictionary) pageTreeObject.getDictionaryObject(COSName.PARENT);
}

生成的文件不包含任何签名字段。我试图更新COSObject。需要对acroform、signatureField、pddocument、page、widget进行更新(true),无结果。签名字段仅在我正常保存时出现。

编辑:我设法添加了一个空签名字段(在COSObject.needToBeUpdate链上编辑的代码),但它破坏了现有的签名。

我错过了什么?谢谢!

我的实际代码:

public class CreateEmptySignatureForm {

public static void main(String[] args) throws IOException
{
    InputStream resource = new FileInputStream("test-semnat.pdf");
    PDDocument document = PDDocument.load(resource);
            
    PDPage page = document.getPage(0);

    // Add a new AcroForm and add that to the document
    PDAcroForm acroForm = new PDAcroForm(document);
    document.getDocumentCatalog().setAcroForm(acroForm);

    acroForm.setSignaturesExist(true);
    acroForm.setAppendOnly(true);
    acroForm.getCOSObject().setDirect(true);

    // Create empty signature field, it will get the name "Signature1"
    PDSignatureField signatureField = new PDSignatureField(acroForm);
    PDAnnotationWidget widget = signatureField.getWidgets().get(0);
    PDRectangle rect = new PDRectangle(50, 250, 200, 50);
    widget.setRectangle(rect);
    widget.getCOSObject().setNeedToBeUpdated(true);
    widget.setPage(page);
    page.getAnnotations().add(widget);
    page.getCOSObject().setNeedToBeUpdated(true);
    acroForm.getFields().add(signatureField);

    // general updates
    document.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);

    OutputStream os = new FileOutputStream("fooo.pdf");
    document.saveIncremental(os);
    System.out.println("done");
}
}

test-semnat.pdf

共有1个答案

唐哲
2023-03-14

问题更新后的剩余问题是替换现有AcroForm定义:

// Add a new AcroForm and add that to the document
PDAcroForm acroForm = new PDAcroForm(document);
document.getDocumentCatalog().setAcroForm(acroForm);

这变化太大了,超出了允许的范围,超出了你的实际需要。

您需要的是检索现有AcroForm定义,并仅将其及其字段条目标记为保存:

PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
acroForm.getCOSObject().setNeedToBeUpdated(true);
COSObject fields = acroForm.getCOSObject().getCOSObject(COSName.FIELDS);
if (fields != null)
    fields.setNeedToBeUpdated(true);

使用我为您的示例文档获得的代码:

(当然,对于没有现有AcroForm定义的文档,您可能需要添加一个新的AcroForm定义,所以

PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
if (acroForm == null) {
    acroForm = new PDAcroForm(document);
    document.getDocumentCatalog().setAcroForm(acroForm);
}
acroForm.getCOSObject().setNeedToBeUpdated(true);
COSObject fields = acroForm.getCOSObject().getCOSObject(COSName.FIELDS);
if (fields != null)
    fields.setNeedToBeUpdated(true);

可能是完整的变体。)

 类似资料:
  • 我必须创建一个PDF文件,其中我使用PDFmake来实现这一点。但PDFmake不具备在文档中添加签名字段的功能。 因此,我打开了一个带有签名字段的示例PDF,并复制了包含签名字段名称的对象:

  • 您好,我可以使用iText 5对PDF文档进行数字签名。我需要再次签署PDF,而在验证PDF时,它表明初始签名无效。您可以在此处查看再次签名的文件。 请参见下面用于标记的代码, 请让我知道出了什么问题。

  • 我想做的是: 使用证书使用openssl对zip文件进行签名,并创建签名文件(PKCS#7) 我安装了openssl并打开了控制台 我创建了一个rsa密钥(openssl genrsa-out key.pem 2048) 我创建了一个请求(openssl req-batch-sha256-new-key key.pem-out request.pem-subj'/c=../st=../l=../o

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

  • 我正在尝试向现有的数字签名pdf(认证签名)中添加一个空签名字段。 我有一个工作流,其中许多用户将签署该文档(批准签名),该文档创建时带有“n”个空签名字段,每个用户一个,我们的应用程序首先应用一个不可见的认证签名,然后每个用户可以在各自的字段中签署该文档,但由于工作流中意外的更改,其他用户可能希望签名,因此,我们希望添加相应的空签名字段,然后应用签名。 我试图将空字段(带有单元格事件的表)添加到

  • 我希望我们拥有iPhone的员工能够让公众对一份文件进行数字签名,该文件最初是基于Spring的网络表单。 此表格仅在我们的内部网上,仅由我们的员工填写。 到目前为止,我的研究考虑了一些可能的解决方案: 手机屏幕上的电子湿墨水签名 目的是证明某个人签署了一份文件。 1从技术上讲是可能的,但并不重要,因为它很容易被复制。 是否可以在iOS设备上通过浏览器和javascript捕获指纹? 3能适应这种