我多次签名时如何删除印章

时间:2019-01-14 07:14:09

标签: itext7

我如何通过p12签名pdf:

signer.setFieldName(fieldName);
signer.signDetached(digest, pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);

我如何尝试删除一个标志:

PdfAcroForm.removeField(fieldName);
PdfAcroForm.flattenFields();

1 个答案:

答案 0 :(得分:0)

如果有人在iText站点上寻找删除数字签名的示例,则会找到this example(与您一样)。严格来说,这是展平签名的示例,即删除整个签名字段,但使其视觉外观成为页面内容的一部分,这有点误导。实际上,代码不仅使签名字段而且对所有字段都平坦。

您在对问题的评论中进行了澄清,

  

我想通过fieldName删除签名值和可视化内容

因此,您特别希望仅更改签名字段,不想真正删除它,而只是清除它,并且不想保留它的外观。因此,您发现的示例在多种方面都不符合您的要求。

首先,您只能清除最近签名的签名字段;否则,您会使所有最近的签名失效。因此,我们可以假设您要清除的签名字段是最外面的一个。

要根据需要清除签名字段,需要删除其值(实际签名和一些元数据)以及字段小部件的外观(严格来说,ISO 32000-2仅允许单个小部件,但是有一个带有多个可视化的签名字段的野外PDF数量),例如使用这种方法:

String clearLastSignature(PdfDocument pdfDocument) {
    SignatureUtil signatureUtil = new SignatureUtil(pdfDocument);
    PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDocument, false);

    List<String> signatureNames = signatureUtil.getSignatureNames();
    if (signatureNames != null && signatureNames.size() > 0) {
        String lastSignatureName = signatureNames.get(signatureNames.size() - 1);
        PdfFormField lastSignatureField = acroForm.getField(lastSignatureName);
        if (null != lastSignatureField.getPdfObject().remove(PdfName.V))
            lastSignatureField.getPdfObject().setModified();
        for (PdfWidgetAnnotation pdfWidgetAnnotation : lastSignatureField.getWidgets()) {
            if (pdfWidgetAnnotation.getPdfObject().remove(PdfName.AP) != null)
                pdfWidgetAnnotation.getPdfObject().setModified();
        }
        return lastSignatureName;
    }
    return null;
}

(来自ClearSignature.java

此方法还返回已清除字段的名称,如果您想在不久后辞职,这将很有帮助。

您可以这样使用此方法:

try (   PdfReader pdfReader = new PdfReader(source);
        PdfWriter pdfWriter = new PdfWriter(clearedFile);
        PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().useAppendMode())) {
    String clearedSignatureName = clearLastSignature(pdfDocument);
}

ClearSignature测试testClearLastSignatureIncrementally

应用于iText签名白皮书示例C2_11_SignatureWorkflow

的输出“ step6_signed_by_alice_bob_carol_and_dave.pdf”

screen shot original

你得到

screen shot cleared

在退出签名字段后,您将得到

screen shot resigned

当心:根据PDF权限和限制,某些PDF文档可能会失败。