Цифровая подпись для документов PDF - PullRequest
0 голосов
/ 30 октября 2018

Можно ли создать цифровую подпись для уже подписанного PDF-документа? Я использую следующий код для создания цифровой подписи для документов PDF.

public void sign(String src, String dest, Certificate[] chain, PrivateKey 
   pk, String digestAlgorithm,String provider, CryptoStandard subfilter, 
   String reason, String location) {


        PdfReader reader;
        FileOutputStream os;
        PdfStamper stamper;

        try {
            reader = new PdfReader(src);
            File destFile = new File(dest);
            String destFilePath = destFile.getAbsolutePath();
            System.out.println("destFilePath=====" + destFilePath);
            os = new FileOutputStream(dest);
            System.out.println("File output " + os);
            stamper = PdfStamper.createSignature(reader, os, '\0');
            System.out.println("stamper " + stamper.getSignatureAppearance());
            // Creating the appearance
            PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
            System.out.println("Appearance " + appearance);
            // appearance.setImage(Image.getInstance("F:/Unibrain/EbidUploadedFolder/" +
            // "/resources/55.png"));
            appearance.setImage(Image.getInstance("F:\\55.png"));
            // appearance.setReason(reason);
            // appearance.setLocation(location);
            appearance.setVisibleSignature(new Rectangle(800, 732, 512, 780), 1, "sig");
            appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION);
            appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION);
            Rectangle cropbox = reader.getCropBox(1);
            float width = 250;
            float height = 50;
            Rectangle rectangle = new Rectangle(cropbox.getRight(width), cropbox.getBottom(), cropbox.getRight(),
                    cropbox.getBottom(height));
            cropbox.setBorderWidth(5);
            appearance.setVisibleSignature(rectangle, 1, "sig");
            // Creating the signature
            ExternalDigest digest = new BouncyCastleDigest();
            System.out.println("digest " + digest);
            ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider);
            System.out.println("Signature " + signature);
            MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

1 Ответ

0 голосов
/ 30 октября 2018

Можно ли создать цифровую подпись для уже подписанного документа PDF?

В общем, да, но дополнительная подпись должна быть добавлена ​​в инкрементном обновлении, чтобы не сделать недействительной существующую подпись. Для некоторых фонов см. этот ответ .

В случае вашего кода это означает, что вы должны заменить строку

stamper = PdfStamper.createSignature(reader, os, '\0');

от

stamper = PdfStamper.createSignature(reader, os, '\0', null, true);

true указывает на то, что подпись должна применяться в режиме добавления , который является языком iText для добавления изменений в добавочное обновление.

Кроме того, вы должны убедиться, что новая подпись создана в другом поле формы. Ваш код добавляет подпись в поле "sig" с кодированным кодом:

appearance.setVisibleSignature(new Rectangle(800, 732, 512, 780), 1, "sig");

Если вы знаете, что имя поля ранее существовавшей подписи отличается, это нормально. В противном случае вы можете заменить «sig» на null, что заставит iText создать уникальное имя поля для новой подписи.


Выше я сказал «в общем, да» - есть исключение, если оригинальная подпись является сертификационной подписью с «изменения не допускаются», применение дополнительной подписи нарушит оригинальную подпись, так как применение является изменением.

...