iText подписывает PDF с пользовательским «Подписанным» именем

#java #itext #certificate #itext7

#java #itext #сертификат #itext7

Вопрос:

Я могу подписать PDF с помощью iText 7.

Теперь я хочу показать другое имя, отличное от того, которое есть в сертификате, например, фамилию (не только в самом PDF-файле с внешним видом, но и в «Rev1: подписано X» в Adobe).

Это код, который я использую для подписи PDF :

 PdfReader reader = new PdfReader(src);
PdfSigner signer = new PdfSigner(reader, new FileOutputStream(dest), new StampingProperties().useAppendMode());

// Create the signature appearance
PdfPage page = signer.getDocument().getPage(1);
Rectangle rect = new Rectangle(10, 10, 120, 80);
PdfSignatureAppearance appearance = signer.getSignatureAppearance().setReason(reason).setPageNumber(1)
.setLocation(location).setPageRect(rect);

signer.setFieldName("sig");

IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
IExternalDigest digest = new BouncyCastleDigest();

// Sign the document using the detached mode, CMS or CAdES equivalent.
signer.signDetached(digest, pks, chain, null, null, null, 0, signatureType);
  

Ответ №1:

Вы спрашиваете, как отобразить имя, отличное от того, которое указано в сертификате, например, фамилию (не только в самом PDF-файле с внешним видом, но и в «Rev1: подписано X» в Adobe).

По сути, это сразу два вопроса: один о том, как настроить текст в подписи на странице документа, а другой о том, как настроить текст, отображаемый Adobe Acrobat на панели подписи.

Настройте текст в подписи на странице документа

Здесь у вас есть, по сути, два соответствующих помощника:

  • PdfSignatureAppearance Метод setLayer2Text позволяет вам установить текст описания в визуализации подписи. Вы можете изменить его стиль, используя setLayer2Font , setLayer2FontSize , и setLayer2FontColor .
  • PdfSignatureAppearance Метод getLayer2 возвращает a PdfFormXObject , на котором вы можете создать полностью настраиваемую визуализацию подписи. Вы также можете использовать getLayer0 для возврата a PdfFormXObject , который служит фоном.

Вы можете выбрать своего помощника в зависимости от требуемой степени настройки.

Настройте текст, отображаемый Adobe Acrobat на панели подписи

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

Немного поэкспериментировав с использованием довольно современного Adobe Acrobat Reader, выясняется, что при определенных обстоятельствах значение записи имени в словаре подписей (если оно вообще установлено) используется здесь вместо информации о сертификате.

Вы можете установить эту запись, используя события подписи, подобные этому:

 PdfSigner pdfSigner = new PdfSigner(...);
pdfSigner.setSignatureEvent(new PdfSigner.ISignatureEvent() {
    @Override
    public void getSignatureDictionary(PdfSignature sig) {
        sig.setName("A Custom Signer");
    }
});
...
  

После подписания с помощью этого дополнения Adobe Acrobat иногда использует «пользовательскую подпись» вместо информации о сертификате на панели подписи.

  • Если вы отключите автоматическую проверку во время открытия в Acrobat Reader

    Настройки

    а затем откройте PDF, вы увидите

    Требуется проверка

    После явного запроса проверки вы получаете

    Допустимо

    Как вы видите, «Пользовательская подпись» все время.

  • Если, с другой стороны, вы активируете автоматическую проверку при открытии в настройках, вы получите

    Автоматически действует

    Как вы видите, здесь используется информация из сертификата.

  • Кроме того, вы всегда получаете «пользовательскую подпись», если Adobe Acrobat не может правильно прочитать подпись (например, из-за неизвестного алгоритма подписи).

Комментарии:

1. Первый способ (редактировать внешний вид подписи непосредственно в PDF) работает, и это не совсем то, что мне нужно (потому что в одном PDF-файле сложно отобразить более 40 подписей …). Второй способ (редактирование Adobe view) у меня не работает. Я не знаю, что я делаю не так, я просто тестирую без редактирования стиля внешнего вида. Событие хорошо вызывается, но ничего не делает. Это может быть из-за самозаверяющего сертификата?

2. Вы настроили свой Adobe Reader так, чтобы он не проверялся при загрузке?

3. О, так что это работает только тогда, когда мы проверяем подпись вручную:/ Это проблема, потому что по умолчанию Adobe установила для параметра значение true, и поэтому по умолчанию мы не видим правильное имя.

4. Правильно, по умолчанию Adobe использует данные сертификата. В настоящее время! Как упоминалось в моем ответе, от Adobe зависит, какая информация туда поступает , и, по-видимому, в настоящее время они используют данные сертификата, если таковые имеются. Я сомневаюсь, что вы можете изменить это поведение по умолчанию для текущих версий Acrobat, если только вы не сделаете контейнер подписи нечитаемым или не выберете нестандартный подфильтр . Однако любой подход, безусловно, противоречит цели подписания.