Nano Hash - криптовалюты, майнинг, программирование

iText Подпишите PDF с пользовательской подписью по имени

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

Теперь я хочу показать имя, отличное от того, которое есть в сертификате, например, фамилию (не только в самом PDF-файле с внешним видом, но и в Rev1: Signed by 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: Signed by X в Adobe).

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

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

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

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

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

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

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

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

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

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 не может правильно прочитать подпись (например, из-за неизвестного алгоритма подписи).

04.11.2020
  • Первый способ (редактировать внешний вид подписи в PDF напрямую) работает, и это не совсем то, что мне нужно (потому что трудно показать более 40+ подписей в одном PDF-файле...). Второй способ (редактировать вид Adobe) у меня не работает. Я не знаю, что я делаю неправильно, я просто тестирую, не редактируя стиль внешнего вида. Событие хорошо называется, но ничего не делает. Это может быть из-за самоподписанного сертификата? 05.11.2020
  • Вы настроили Adobe Reader так, чтобы он не выполнял проверку при загрузке? 05.11.2020
  • О, так это работает, только когда мы проверяем подпись вручную :/ Это проблема, потому что по умолчанию Adobe установила для параметра значение true, и поэтому по умолчанию мы не видим хорошего имени. 05.11.2020
  • Верно, по умолчанию Adobe использует данные сертификата. В настоящее время! Как уже упоминалось в моем ответе, какая информация туда поступает, зависит от Adobe, и, по-видимому, в настоящее время они используют данные сертификата, если они доступны. Я сомневаюсь, что вы сможете изменить это поведение по умолчанию для текущих версий Acrobat, если вы не сделаете контейнер подписи нечитаемым или не выберете нестандартный SubFilter. Тем не менее, любой подход, безусловно, противоречит цели подписания. 05.11.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..