Попытка подписать документ PDF с Java. Почему подпись недействительна в файлах PDF? - PullRequest
0 голосов
/ 29 октября 2018

В настоящее время я работаю с PDF-файлами в приложении Java, которое вносит некоторые изменения в PDF-документы.

В настоящее время подписание этих PDF-файлов работает, так как я использую такие классы, как FileInputStream и FileOutputStream. По сути, я копирую исходные документы из исходной папки, а затем помещаю их в выходную папку с помощью. Я использую класс PDDocument с pdfbox 1.8.9

Однако я хочу использовать один и тот же файл, то есть я больше не претендую на то, что копирую PDF-файлы. Я хочу взять документ, подписать его и перезаписать оригинальный.

Поскольку я узнал, что указывать FileInputStream и FileOutputStream на один и тот же файл не очень хорошая идея, я просто попытался использовать класс File.

Я попробовал следующее:

       File file = new File(locOriginal);    
                PDDocument doc = PDDocument.load(file); 
                PDSignature signature = new PDSignature();
                Overlay overlay = new Overlay();

//The signature itself. It has not been modified
            signature.setFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED); // default filter

       signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);

                if (msg.getAreaNegocio().startsWith("A")) {
                    signature.setName(this.campoCertificadoAcquiring);
                    signature.setLocation(this.localCertificadoAcquiring);
                    signature.setReason(this.razaoCertificadoAcquiring);
                }else {
                    signature.setName(this.campoCertificadoIssuing);
                    signature.setLocation(this.localCertificadoIssuing);
                    signature.setReason(this.razaoCertificadoIssuing);
                }

                // register signature dictionary and sign interface
               doc.addSignature(signature,this);
              doc.saveIncremental(file.getAbsolutePath());

               doc.close();

Мой файл PDF перезаписывается, как задумано, однако подпись больше не действительна, когда я открываю файл. Я читаю эти вопросы ... Это относится к любому из этих вопросов? Что я могу сделать, чтобы решить это?

PDFBox 1.8.10: при заполнении и подписи PDF создаются недействительные подписи

PDFBox - открытие и сохранение подписанного PDF-файла делает мою подпись недействительной

Спасибо за помощь!

1 Ответ

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

1.8. * saveIncremental(filename) глючил до версии PDFBox 1.8.16. Это описано в PDFBOX-4312 , но сбивает с толку, потому что пользователь удалил большинство своих собственных сообщений и имел множество других проблем. Если вы настаиваете на использовании устаревшей версии (которая имеет проблему с безопасностью), попробуйте этот код вместо вызова saveIncremental(filename):

//BEWARE: do not "optimize" this method by using buffered streams,
// because COSStandardOutputStream only allows seeking
// if a FileOutputStream is passed, see PDFBOX-4312.
FileInputStream fis = new FileInputStream(fileName);
byte[] ba = IOUtils.toByteArray(fis);
fis.close();
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(ba);
fis = new FileInputStream(fileName);
saveIncremental(fis, fos);

И нет, я не думаю, что вопросы, на которые вы ссылались, касались вашей проблемы.

Кстати, я не считаю хорошей идеей перезаписать исходный файл. Вы рискуете потерять свой файл в случае ошибки или потери питания.

См. Также комментарий от mkl: setFilter() обычно вызывается с параметром PDSignature.FILTER_ADOBE_PPKLITE.

...