Как подписать и проверить 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.

Благодарю.

0 ответов

Другие вопросы по тегам