Если вы ищете пример для удаления цифровых подписей на сайте iText, вы найдете этот пример (как вы это сделали). Это немного вводит в заблуждение, поскольку, строго говоря, это пример сглаживания подписи, то есть удаления всего поля подписи, но при этом его внешний вид является частью содержимого страницы. На самом деле код выравнивает не только поле подписи, но и все поля.
Вы уточнили в комментарии к вашему вопросу, хотя:
я хочу удалить значение подписи и его визуализацию по 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 test testClearLastSignatureIncrementally
)
Применяется к выходным данным "step6_signed_by_alice_bob_carol_and_dave.pdf" из примера документа подписи iText C2_11_SignatureWorkflow
вы получите
и после отставки поля подписи вы получаете это
Осторожно: в зависимости от разрешений и ограничений PDF это может не работать для некоторых документов PDF.