Вместо цифровой подписи появляется синее поле, а панель подписи содержит неподписанные подписи

Я использую библиотеку pdfbox для добавления подписи.

Я пытаюсь прикрепить цифровую подпись в формате 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);
      }
   }

Пожалуйста, поделитесь подписанным PDF-файлом для анализа. «Какова должна быть причина получения синей коробки?» - под «синей коробкой» вы имеете в виду голубую ленточку сверху с надписью «Сертифицировано...»? Это нормально для подписанных PDF-файлов, не так ли? «указывалось, что pdf сертифицирован» — скорее всего, в вашем коде установлены разрешения MDP (SigUtils.setMDPPermission); установка разрешений MDP делает подпись сертификационной подписью.

mkl 12.03.2024 17:52

@mkl, Спасибо за ответ. Дело не в голубой ленточке сверху. Я говорю о трех полях, которые появляются под этой синей лентой. Эти три поля — это три подписи, которые я добавил в PDF.

Deep Morker 13.03.2024 06:01

@mkl, я приложил подписанный PDF-файл.

Deep Morker 13.03.2024 06:28

Эти 3 поля представляют собой поля для подписи без знака. Они содержат изображение подписи (что вводит в заблуждение), но не электронную подпись, то есть подпись, которая использует секретный пароль для подтверждения криптографической контрольной суммы файла (несколько упрощенное объяснение).

Tilman Hausherr 13.03.2024 08:04

@TilmanHausherr Спасибо за ваш ответ. Так стоит ли мне удалить эти поля для подписи? Наша цель — добавить подписи в формате PDF, и, наконец, мы хотим заверить документ, добавив нотариальный сертификат.

Deep Morker 13.03.2024 11:54

@KJ Спасибо за ваш ответ, этот файл подписан всеми тремя пользователями. Ни одной подписи не осталось.

Deep Morker 13.03.2024 11:57

Эти три поля вообще не следовало добавлять. Насколько я вижу, исходный файл был постепенно изменен с использованием одной реальной электронной подписи (с пустым внешним видом, что является законным) и трех псевдоподписей. Очень странно. Вопрос в следующем: что вы пытались сделать? Мне потребовались еще три электронные подписи, затем нужно было добавить пустые поля, а затем три пользователя должны были подписать эти поля, например. со своей картой PKI.

Tilman Hausherr 13.03.2024 13:27

@Deep Мне потребовалось немало комментариев, чтобы понять, чего вы на самом деле хотите достичь. По крайней мере, я надеюсь, что понял. Смотрите мой ответ.

mkl 13.03.2024 16:17

Я пытаюсь добавить подписи и проверить их с помощью сертификата. И для этого в первую очередь я добавляю все изображения подписей с помощью метода addSignatureField, упомянутого в коде. И после этого я прикрепляю нотариальное свидетельство, чтобы оно было сертифицировано. Сертификат добавит невидимую подпись в pdf. продолжение в следующем комментарии.

Deep Morker 13.03.2024 17:56

В методе addSignatureField я пытаюсь получить список PDField из PDAcroForm. После этого я добавляю в этот список поле PDSignature. И я получаю виджет из этого поля подписи. Затем я рисую изображение с помощью PDFContentStream и добавляю виджет в документ. И из-за этого поля подписи я получаю неподписанные поля подписи в подписанном PDF-файле, как показано в прикрепленном PDF-файле и на снимках экрана. продолжение в следующем комментарии.

Deep Morker 13.03.2024 17:56

Если я удалю поле PDSignature и попробую, изображение подписи не будет видно на странице PDF. Кроме того, мне приходится выполнять эти операции, связанные с PDAcroForm, потому что, если я попытаюсь подписать уже подписанный PDF-файл, он обнаружит подпись и предупредит меня об этом.

Deep Morker 13.03.2024 17:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
11
210
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по вашим комментариям, вы, похоже, пытаетесь реализовать что-то похожее на обычный рабочий процесс Adobe Acrobat Sign: все «подписавшие» пользователи предоставляют изображение рукописной подписи, и только служба подписи применяет реальную цифровую подпись.

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

Ошибка

Ошибка вашего подхода заключается в том, что вы используете фактические поля формы подписи для изображений рукописной подписи. Поля формы подписи предназначены для цифровых подписей (и временных меток), а не для простых электронных подписей.

Поля вашей подписи с изображениями рукописной подписи имеют визуализации (показывающие изображения), но не имеют значений (которые должны быть словарями подписей с контейнерами подписей CMS). Таким образом, Acrobat (как и другие программные продукты) предполагает, что эти поля подписи еще не подписаны.

Теперь в Acrobat есть функция (или причуда?) отображать неподписанные поля подписи синеватым цветом с красной стрелкой «Подписать здесь» и игнорировать существующий внешний вид.

Это объясняет, что вы видите

Другие зрители могут относиться к этому по-другому. Например, встроенная программа просмотра в Chrome показывает изображения рукописной подписи:

Исправление

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

Альтернативные варианты отображения изображений рукописных подписей включают в себя:

  • добавление этих изображений к содержимому статической страницы;
  • добавление этих изображений в виде некоторой общей аннотации, не связанной с виджетами;
  • добавление этих изображений в качестве (неактивных) кнопок.

Хотя, учитывая ваше желание...

Я хочу, чтобы мои подписи были видны в Adobe Acrobat PDF Reader с подтвержденным статусом.

Эти три простые электронные подписи невозможно проверить, поскольку они не являются цифровыми подписями. Таким образом, исправление полностью удалит их из панели подписи.

Я понимаю вашу точку зрения. Теперь я попробовал два способа добавления изображений. 1) Без добавления виджета в аннотацию страницы. А это код — [ctxt.io/2/AACIMdk2EQ] При этом я не использую виджет, но у меня возникли некоторые проблемы. а) изображения инвертируются при добавлении на страницу. б) размер и координаты изображения различаются для разных PDF-файлов. (Здесь для разных PDF-файлов я рассчитал разные координаты x и y). продолжение в следующем комментарии.

Deep Morker 14.03.2024 08:52

2) Использование виджета. Я обнаружил, что PDSignature добавляет COSName.FT в качестве ключа и COSName.SIG в качестве значения в COSDictionary виджета. (Я также пробовал сделать это извне без PDSignature, то же самое). Я пробовал другие имена COSName, такие как BBOX, IMAGE, RECT, но проблема в том, что когда я открываю PDF-файл в браузере, изображение знака отображается в Adobe Acrobat, оно не отображается. Так можете ли вы помочь мне в вышеуказанных вариантах?

Deep Morker 14.03.2024 09:01

@DeepMorker «изображения инвертируются при добавлении на страницу» - к сожалению, вы не предоставили PDF и PNG, поэтому я запустил ваш код с имеющимися у меня файлами. Инверсии изображения мне не удалось наблюдать. «Размер изображения и координаты различаются для разных PDF-файлов». - но это верно для любого подхода, не так ли?

mkl 14.03.2024 22:09

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