В вашем коде есть две проблемы, из-за которых Adobe Reader правильно сообщает о проблемах. Однако я еще не уверен, будет ли Adobe Reader счастливым после их исправления.
Проблемы в вашем рабочем процессе:
- Сертификационная подпись как вторая подпись
- PAdES ESI C расширение объявляется только после первой подписи
Сертификационная подпись как вторая подпись
Прежде всего, ваш код применяет обычную подпись утверждения (PdfSigner.NOT_CERTIFIED
установить signer.SetCertificationLevel
) в качестве первой подписи, а затем сертификационной подписи (PdfSigner.CERTIFIED_NO_CHANGES_ALLOWED
задано signer.SetCertificationLevel
) в качестве второй.
Это не допускается. Согласно спецификации PDF ISO 32000-1:
Документ PDF может содержать [...]
не более одной сертификационной подписи (PDF 1.5). [...] Словарь подписи должен содержать справочный словарь подписи (см. Таблицу 253), который имеет метод преобразования DocMDP. [...]
Документ может содержать только одно поле подписи, которое содержит метод преобразования DocMDP; это должно быть первое подписанное поле в документе.
(разделы 12.8.1 и 12.8.2.2.1 ISO 32000-1)
И согласно ISO 32000-2:
Документ PDF может содержать следующие стандартные типы подписей: [...]
Одна или несколько подписей утверждения (также известных как подписи получателя ). Они должны следовать за сертификационной подписью, если таковая имеется.
(раздел 12.8.1 ISO 32000-2)
В любом случае подписи утверждения должны следовать сертификационной подписи, а не предшествовать ей.
(Изменение между версиями спецификации, скорее всего, было сделано для того, чтобы временные метки документа предшествовали сертификационной подписи.)
Таким образом, уже сразу после применения второй подписи Adobe Reader должен был подать жалобу!
Однако есть способ изменить уровень сертификации в более поздней подписи одобрения : Если ваш Валидатор PDF поддерживает ISO 32000-1 с Дополнением Adobe с ExtensionLevel 3 или ISO 32000-2, для этого можно использовать преобразования FieldMDP.
Прочтите этот ответ для получения некоторой информации об этой опции.
PAdES ESI C расширение объявляется только после первой подписи
Ваша первая подпись применяется с hout документ, декларирующий, что применяются любые расширения PDF. Таким образом, валидатор PDF может предположить, что для проверки подписи применяются базовые правила ISO 32000-1, в частности, что уровень сертификации «никакие изменения не разрешены» действительно означает, что нет изменения разрешены. Это правило может отличаться только в том случае, если заявлено соответствующее расширение и валидатор PDF поддерживает его. В частности,
- ESI C уровень расширения 1 (согласно ETSI TS 102 778-4 и EN 319 142-1) или
- ADBE уровень расширения 5 (согласно ETSI TS 102778-4) или
- ADBE уровень расширения 8 (согласно ETSI EN 319 142-1)
должно означать, что, согласно ISO 32000-2 тем временем,
Изменения в PDF, которые являются инкрементными обновления, которые включают только данные, необходимые для добавления меток времени DSS и / или документа в документ, не должны рассматриваться как изменения в документе.
LTV добавляет код iText в ваши PDF-файлы, а затем объявляет ESI C уровень расширения 5 . Я не уверен, откуда это взялось, есть ли другой TS или EN, упоминающий этот уровень, или уровни ESI C и ADBE были перемешаны.
Таким образом, уже с вашей первой подписью вы должны объявить одно из упомянутых выше расширений.
Если document
является вашим экземпляром PdfDocument
до или во время применения первой подписи (вам, возможно, придется получить его из вашего PdfSigner signer
используя signer.GetDocument()
), вы можете объявить расширение следующим образом:
PdfDeveloperExtension extension = new iText.Kernel.Pdf.PdfDeveloperExtension
(PdfName.ESIC, PdfName.Pdf_Version_1_7, 1);
document.GetCatalog().AddDeveloperExtension(extension);
В качестве альтернативы вы должны установить версию PDF 2.0 при подписании. Однако это может вызвать другие проблемы.