Проблема возникает, когда вторая сторона подписывает, мы загружаем документ в формате Adobe PDF и обнаруживаем, что первая подпись недействительна.
Метод подписи:-
Код: Выделить всё
private byte[] fillAllSignatures(RecipientSignRequest.SignatureParams sigParams, byte[] interimPdf, Date signDate) throws IOException {
while (true) {
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
SignatureOptions signatureOptions = null;
try (PDDocument doc = Loader.loadPDF(interimPdf)) {
PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
// Step 1: Find unfilled signature fields
List
signatures = PdfUtils.findUnfilledSignatureFieldsForRecipient(doc, sigParams.getSignatureFields());
acroForm.setAppendOnly(true);
// Break if no more unfilled signatures are found
if (signatures.isEmpty()) {
break;
}
// Step 2: Set MDP Permissions (allow form filling but no other changes)
int accessPermissions = SigUtils.getMDPPermission(doc);
for (PDSignature signature : signatures) {
if (accessPermissions == 0) {
acroForm.setSignaturesExist(false);
SigUtils.setMDPPermission(doc, signature, 2); // Allow form filling and signing
}else{
acroForm.setSignaturesExist(true);
}
// Step 3: Set signature properties
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
visibleSignatureProperties.buildSignature(); // Prepare visual signature
signature.setName(visibleSignatureProperties.getSignerName());
signature.setLocation(visibleSignatureProperties.getSignerLocation());
signature.setReason(visibleSignatureProperties.getSignatureReason());
Calendar calendar = Calendar.getInstance();
calendar.setTime(signDate);
signature.setSignDate(calendar);
// Step 4: Add visual signature to the document
signatureOptions = new SignatureOptions();
signatureOptions.setVisualSignature(visibleSignatureProperties.getVisibleSignature());
signatureOptions.setPage(visibleSignatureProperties.getPage() - 1);
doc.addSignature(signature, this, signatureOptions);
}
// Step 5: Save document incrementally to preserve previous changes
doc.saveIncremental(outputStream);
interimPdf = outputStream.toByteArray();
// If all signatures have been filled, break the loop
if (signatures.size()
Подробнее здесь: [url]https://stackoverflow.com/questions/79057231/pdf-box-2-0-32-3-0-2-issue-with-multi-party-signature-first-signature-inval[/url]