使用 pdfbox java 为签名文件添加自定义值

add custom value for signature file using pdfbox java

我将如何添加我的自定义值,如 (xyz123) 添加时 signature.Because 当我添加签名时我无法添加自定义文件进行签名。字段“signature1”自动添加到文档中。 我的输出文件截图附上你好:

我想将自定义值添加为 (xyz123)

,而不是“signature1”
            throws IOException {
        PDSignature pdSignature = new PDSignature();
        pdSignature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
        pdSignature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
        pdSignature.setName("jvmfy");
        pdSignature.setReason("Learn how to sign pdf with jvmfy.com!");
        pdSignature.setLocation("location");

        // the signing date, needed for valid signature
        pdSignature.setSignDate(Calendar.getInstance());

        // register signature dictionary and sign interface
        document.addSignature(pdSignature, signature);

        // write incremental (only for signing purpose)
        // use saveIncremental to add signature, using plain save method may break up a
        // document
        document.saveIncremental(output);
    }
private void signDetached(SignatureInterface signature, PDDocument document, OutputStream output)
            throws IOException {
        PDSignature pdSignature = new PDSignature();
        pdSignature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
        pdSignature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
        
        pdSignature.setSignDate(Calendar.getInstance());
        PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
        if (acroForm == null)
        {
            acroForm = new PDAcroForm(document);
            document.getDocumentCatalog().setAcroForm(acroForm);
        }
        PDSignatureField signatureField = new PDSignatureField(acroForm);
        signatureField.setPartialName("xyz123");
        signatureField.setValue(pdSignature);
        signatureField.getWidgets().get(0).setPage(document.getPage(0));
        document.addSignature(pdSignature, signature);
        document.saveIncremental(output);
    }```

您需要 PDSignatureField 对象...当您拥有它时,请执行以下操作:

signatureField.setPartialName("xyz123");

如果代码没有创建自己的 PDSignatureField 对象(如不可见签名字段的示例),PDFBox 会为您创建。您可以通过调用 PDDocument.getSignatureFields().

获取所有 PDSignatureField 个对象

如果是你自己创建的文件,那么只有一个这样的字段。如果您正在签署现有文件,那么它会更棘手,那么我建议您比较字段名称或 getCOSObject() 的结果(即创建两个集合)。不要假设最后一个是正确的(在某些情况下它不是)。

或者您自己创建字段:

PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(null);
if (acroForm == null)
{
    acroForm = new PDAcroForm(document);
    document.getDocumentCatalog().setAcroForm(acroForm);
}
PDSignatureField signatureField = new PDSignatureField(acroForm);
signatureField.setValue(signature);
signatureField.getWidgets().get(0).setPage(document.getPage(0));
acroForm.getFields().add(signatureField);
// page annotation, only needed if PDF/A
document.getPage(0).getAnnotations().add(signatureField.getWidgets().get(0));
document.getPage(0).getCOSObject().setNeedToBeUpdated(true);