Как установить имя подписывающего лица? - PullRequest
0 голосов
/ 28 мая 2020

Как установить имя подписывающего лица в iText7? Я пытаюсь использовать .SetContact, но оно не отображается как имя подписывающего.

 PdfSignatureAppearance _sap = signer.GetSignatureAppearance();

 _sap
    .SetPageRect(new iText.Kernel.Geom.Rectangle(_x, _y, Models.AppSettings.Application.Core.SIGNATURE_BOX_WIDTH, Models.AppSettings.Application.Core.SIGNATURE_BOX_HEIGHT))
    .SetPageNumber(_p)
    .SetSignatureCreator(Models.AppSettings.Application.Name)
    .SetContact(_contact)
    .SetLocation(_location)
    .SetReason(_reason);

    _sap.SetSignatureGraphic(_signature_graph);
    _sap.SetRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION);

enter image description here

Я ожидаю, что у меня будет что-то вроде ниже:

Digitally signed by: 
Don2
Date: xxxxx
Reason:xxxxx
Location: xxxx

Я пытаюсь установить:

 _sap.SetRenderingMode(PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION);

, но здесь возникло нулевое исключение:

 ExternalEmptySignatureContainer container = new ExternalEmptySignatureContainer();
 signer.SignExternalContainer(container, 
 Models.AppSettings.Application.Core.ESTIMATED_SIGNATURE_CONTAINER_SIZE);

насколько я понимаю: SetContact - это имя подписавшего. CMIIW

Пожалуйста, помогите

спасибо Дон

1 Ответ

0 голосов
/ 06 августа 2020

Если вы не используете SetLayer2Text для установки собственного описания или построения всего внешнего вида (на GetLayer2 XObject), iText создает описание, подобное этому:

StringBuilder buf = new StringBuilder();
buf.Append("Digitally signed by ");
String name = null;
CertificateInfo.X500Name x500name = CertificateInfo.GetSubjectFields((X509Certificate)signCertificate);
if (x500name != null) {
    name = x500name.GetField("CN");
    if (name == null) {
        name = x500name.GetField("E");
    }
}
if (name == null) {
    name = "";
}
buf.Append(name).Append('\n');
buf.Append("Date: ").Append(SignUtils.DateToString(signDate));
if (reason != null) {
    buf.Append('\n').Append(reasonCaption).Append(reason);
}
if (location != null) {
    buf.Append('\n').Append(locationCaption).Append(location);
}
text = buf.ToString();

(отрывок из метод PdfSignatureAppearance GetAppearance)

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

_sap.SetCertificate(SIGNER_CERTIFICATE);

В качестве альтернативы, как указано в начале, предоставьте индивидуальное описание

_sap.SetLayer2Text(CUSTOM_DESCRIPTION);

, которое может отображать что угодно хочешь.

Насколько я понимаю: SetContact - это имя подписавшего. CMIIW

Согласно спецификации PDF:

ContactInfo текстовая строка (необязательно) Информация, предоставленная подписавшим, для включения получатель, чтобы связаться с подписавшимся для проверки подписи.

ПРИМЕР 3 Номер телефона.

(ISO 32000-1, Таблица 252 - Записи в словаре подписей)

Таким образом, контактная информация предназначена не для имени подписавшего, а для некоторых средств контакта с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...