我如何通过p12签名pdf:
signer.setFieldName(fieldName);
signer.signDetached(digest, pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
我如何尝试删除一个标志:
PdfAcroForm.removeField(fieldName);
PdfAcroForm.flattenFields();
答案 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;
}
此方法还返回已清除字段的名称,如果您想在不久后辞职,这将很有帮助。
您可以这样使用此方法:
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
你得到
在退出签名字段后,您将得到
当心:根据PDF权限和限制,某些PDF文档可能会失败。