Я пытаюсь прикрепить цифровую подпись в формате PDF и проверить ее в центре сертификации Notarius. Когда я пытаюсь прикрепить сертификат в формате PDF и открыть его в Adobe Acrobat, вместо изображения подписи на экране появляется синяя рамка. Кроме того, если я открою панель подписи этого PDF-файла, она укажет, что PDF-файл сертифицирован, но содержит три неподписанных поля для подписи (поскольку у нас есть три подписи в PDF-файле). Какая должна быть причина получения синей коробки? Я хочу, чтобы мои подписи были видны в Adobe Acrobat PDF Reader с подтвержденным статусом.
Вот несколько изображений, прикрепленных для справки. PDF с подписьюПанель для подписи для одноименного подписанного pdf-файла
скачайте подписанный PDF-файл и откройте его в Adobe Acrobat
Я дал код, который используется для вставки знака в PDF-файл.
private void addSignatureField(PdfField pdfField,PDDocument document,PDAcroForm pdfForm,File signImage,PrintLocation printLocation) throws Exception
{
PDRectangle rectangle = signatureFieldRectangle(document.getPage(0),pdfField,printLocation);
PDPage pdPage = document.getPage(pdfField.getPage());
List<PDField> pdfFormFields = pdfForm.getFields();
PDSignatureField signatureField = new PDSignatureField(pdfForm);
signatureField.setPartialName(pdfField.getName());
PDAnnotationWidget widget = signatureField.getWidgets().get(0);
pdfFormFields.add(signatureField);
widget.setRectangle(rectangle);
widget.setPage(pdPage);
PDStream stream = new PDStream(document);
PDFormXObject form = new PDFormXObject(stream);
form.setResources(new PDResources());
form.setFormType(1);
PDRectangle bbox = new PDRectangle(rectangle.getWidth(), rectangle.getHeight());
form.setBBox(bbox);
PDAppearanceDictionary appearance = new PDAppearanceDictionary();
appearance.getCOSObject().setDirect(true);
PDAppearanceStream appearanceStream = new PDAppearanceStream(form.getCOSObject());
appearance.setNormalAppearance(appearanceStream);
widget.setAppearance(appearance);
try (PDPageContentStream cs = new PDPageContentStream(document,appearanceStream))
{
cs.setNonStrokingColor(Color.white);
cs.addRect(-5000, -5000, 10000, 10000);
cs.fill();
if (signImage != null) {
cs.saveGraphicsState();
cs.transform(Matrix.getScaleInstance(0.25f, 0.25f));
PDImageXObject img = PDImageXObject.createFromFileByExtension(signImage, document);
cs.drawImage(img, 0, 0);
cs.restoreGraphicsState();
}
}
pdPage.getAnnotations().add(widget);
COSDictionary pageTreeObject = pdPage.getCOSObject();
while (pageTreeObject != null) {
pageTreeObject.setNeedToBeUpdated(true);
pageTreeObject = (COSDictionary) pageTreeObject.getDictionaryObject(COSName.PARENT);
}
}
@mkl, Спасибо за ответ. Дело не в голубой ленточке сверху. Я говорю о трех полях, которые появляются под этой синей лентой. Эти три поля — это три подписи, которые я добавил в PDF.
@mkl, я приложил подписанный PDF-файл.
Эти 3 поля представляют собой поля для подписи без знака. Они содержат изображение подписи (что вводит в заблуждение), но не электронную подпись, то есть подпись, которая использует секретный пароль для подтверждения криптографической контрольной суммы файла (несколько упрощенное объяснение).
@TilmanHausherr Спасибо за ваш ответ. Так стоит ли мне удалить эти поля для подписи? Наша цель — добавить подписи в формате PDF, и, наконец, мы хотим заверить документ, добавив нотариальный сертификат.
@KJ Спасибо за ваш ответ, этот файл подписан всеми тремя пользователями. Ни одной подписи не осталось.
Эти три поля вообще не следовало добавлять. Насколько я вижу, исходный файл был постепенно изменен с использованием одной реальной электронной подписи (с пустым внешним видом, что является законным) и трех псевдоподписей. Очень странно. Вопрос в следующем: что вы пытались сделать? Мне потребовались еще три электронные подписи, затем нужно было добавить пустые поля, а затем три пользователя должны были подписать эти поля, например. со своей картой PKI.
@Deep Мне потребовалось немало комментариев, чтобы понять, чего вы на самом деле хотите достичь. По крайней мере, я надеюсь, что понял. Смотрите мой ответ.
Я пытаюсь добавить подписи и проверить их с помощью сертификата. И для этого в первую очередь я добавляю все изображения подписей с помощью метода addSignatureField, упомянутого в коде. И после этого я прикрепляю нотариальное свидетельство, чтобы оно было сертифицировано. Сертификат добавит невидимую подпись в pdf. продолжение в следующем комментарии.
В методе addSignatureField я пытаюсь получить список PDField из PDAcroForm. После этого я добавляю в этот список поле PDSignature. И я получаю виджет из этого поля подписи. Затем я рисую изображение с помощью PDFContentStream и добавляю виджет в документ. И из-за этого поля подписи я получаю неподписанные поля подписи в подписанном PDF-файле, как показано в прикрепленном PDF-файле и на снимках экрана. продолжение в следующем комментарии.
Если я удалю поле PDSignature и попробую, изображение подписи не будет видно на странице PDF. Кроме того, мне приходится выполнять эти операции, связанные с PDAcroForm, потому что, если я попытаюсь подписать уже подписанный PDF-файл, он обнаружит подпись и предупредит меня об этом.
Судя по вашим комментариям, вы, похоже, пытаетесь реализовать что-то похожее на обычный рабочий процесс Adobe Acrobat Sign: все «подписавшие» пользователи предоставляют изображение рукописной подписи, и только служба подписи применяет реальную цифровую подпись.
Ваша реализация помещает эти изображения рукописных подписей в PDF-файл с помощью полей подписи и, наконец, добавляет единственную реальную цифровую подпись в качестве подписи автора.
Ошибка вашего подхода заключается в том, что вы используете фактические поля формы подписи для изображений рукописной подписи. Поля формы подписи предназначены для цифровых подписей (и временных меток), а не для простых электронных подписей.
Поля вашей подписи с изображениями рукописной подписи имеют визуализации (показывающие изображения), но не имеют значений (которые должны быть словарями подписей с контейнерами подписей CMS). Таким образом, Acrobat (как и другие программные продукты) предполагает, что эти поля подписи еще не подписаны.
Теперь в Acrobat есть функция (или причуда?) отображать неподписанные поля подписи синеватым цветом с красной стрелкой «Подписать здесь» и игнорировать существующий внешний вид.
Это объясняет, что вы видите
Другие зрители могут относиться к этому по-другому. Например, встроенная программа просмотра в Chrome показывает изображения рукописной подписи:
В качестве исправления просто не используйте поля подписи для простых электронных подписей, а только для цифровых подписей.
Альтернативные варианты отображения изображений рукописных подписей включают в себя:
Хотя, учитывая ваше желание...
Я хочу, чтобы мои подписи были видны в Adobe Acrobat PDF Reader с подтвержденным статусом.
Эти три простые электронные подписи невозможно проверить, поскольку они не являются цифровыми подписями. Таким образом, исправление полностью удалит их из панели подписи.
Я понимаю вашу точку зрения. Теперь я попробовал два способа добавления изображений. 1) Без добавления виджета в аннотацию страницы. А это код — [ctxt.io/2/AACIMdk2EQ] При этом я не использую виджет, но у меня возникли некоторые проблемы. а) изображения инвертируются при добавлении на страницу. б) размер и координаты изображения различаются для разных PDF-файлов. (Здесь для разных PDF-файлов я рассчитал разные координаты x и y). продолжение в следующем комментарии.
2) Использование виджета. Я обнаружил, что PDSignature добавляет COSName.FT в качестве ключа и COSName.SIG в качестве значения в COSDictionary виджета. (Я также пробовал сделать это извне без PDSignature, то же самое). Я пробовал другие имена COSName, такие как BBOX, IMAGE, RECT, но проблема в том, что когда я открываю PDF-файл в браузере, изображение знака отображается в Adobe Acrobat, оно не отображается. Так можете ли вы помочь мне в вышеуказанных вариантах?
@DeepMorker «изображения инвертируются при добавлении на страницу» - к сожалению, вы не предоставили PDF и PNG, поэтому я запустил ваш код с имеющимися у меня файлами. Инверсии изображения мне не удалось наблюдать. «Размер изображения и координаты различаются для разных PDF-файлов». - но это верно для любого подхода, не так ли?
Пожалуйста, поделитесь подписанным PDF-файлом для анализа. «Какова должна быть причина получения синей коробки?» - под «синей коробкой» вы имеете в виду голубую ленточку сверху с надписью «Сертифицировано...»? Это нормально для подписанных PDF-файлов, не так ли? «указывалось, что pdf сертифицирован» — скорее всего, в вашем коде установлены разрешения MDP (
SigUtils.setMDPPermission
); установка разрешений MDP делает подпись сертификационной подписью.