Как подписать и проверить PDF-файл с несколькими подписями, используя iText?
Я пытаюсь сделать простую демоверсию и проверить множественную подпись в PDF-файле, используя iText. Процесс подписания был в порядке, два поля подписи появились, когда я просматривал PDF-файл с помощью Foxit Reader. Но первая подпись, foxit, объявила, что она была изменена. Я попытался проверить еще раз с помощью кода Java, используя iText, но получил тот же результат. Вот мой код:
подписание
PdfReader reader;
try {
reader = new PdfReader(inputData);
} catch (IOException e1) {
LOG.error("IOException: " + e1.getMessage());
return null;
}
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
PdfStamper stamper = null;
try {
stamper = PdfStamper.createSignature(reader, outStream, '\0');
} catch (DocumentException e1) {
LOG.error("DocumentException: " + e1.getMessage());
return null;
} catch (IOException e1) {
LOG.error("IOException: " + e1.getMessage());
return null;
}
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(rect, 1, gen.nextString());
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String singingTime = df.format(new Date());
String signature = "Signed by: " + author + "\nReason: " + appearance.getReason() + "\nDate: " + singingTime;
appearance.setLayer2Text(signature);
TSAClient tsaCli = null;
if (useTsa) {
tsaCli = new TSAClientBouncyCastle(tsaUrl, tsaAccount, tsaPwd);
}
try {
MakeSignature.signDetached(appearance, digest, es, certChain, null,
null, tsaCli, 0, CryptoStandard.CMS);
result = outStream.toByteArray();
outStream.close();
} catch (IOException e) {
LOG.error("IOException: " + e.getMessage());
} catch (DocumentException e) {
LOG.error("DocumentException: " + e.getMessage());
} catch (GeneralSecurityException e) {
LOG.error("GeneralSecurityException: " + e.getMessage());
}
проверка
private int verify(byte[] signedData) {
PdfReader reader;
try {
reader = new PdfReader(signedData);
} catch (IOException e) {
LOG.error("CANNOT LOAD SIGNED DATA. " + e.getMessage());
return ValidationError.CANNOT_LOAD_SIGNED_DATA;
}
AcroFields fields = reader.getAcroFields();
ArrayList<String> names = fields.getSignatureNames();
if (names == null || names.isEmpty()) {
LOG.error("SIGNATURE NOT FOUND");
return ValidationError.SIGNATURE_NOT_FOUND;
}
for (String name : names) {
PdfPKCS7 pkcs7 = fields.verifySignature(name);
boolean signatureValid = false;
try {
signatureValid = pkcs7.verify();
} catch (GeneralSecurityException e) {
LOG.error("Signature with field name " + name + " is invalid");
}
if (!signatureValid) {
LOG.error("[CONTENT]: Document has modified.");
return ValidationError.SIGNATURE_INVALID; //The first signature return false here.
}
}
return ValidationError.SIGNATURE_VALID;
}
И я использовал iText ver 5.5.8.
Благодарю.