Подпишите объединенный PDF-файл в режиме добавления с помощью CERTIFIED_NO_CHANGES_ALLOWED

Я попытался подписать PDF-файл с режимом добавления и уровнем сертификации CERTIFIED_NO_CHANGES_ALLOWED, но некоторые PDF-файлы показаны как измененные и, следовательно, недействительные в Acrobat.

itext 5.5.6, код:

PdfStamper stp = PdfStamper.createSignature(reader, os,'\0',null,true);
PdfSignatureAppearance app = stp.getSignatureAppearance();
app.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);

Файл PDf создается с помощью wkhtmltopdf и объединяется с самим собой с помощью pdfunite (CentOS 7).

Вот zip с образцом PDF: https://www.dropbox.com/s/lea6r9fup6th44c/test_pdf.zip?dl=0

g.pdf - исходный PDF-файл
2g.pdf - объединенная версия (pdfunite g.pdf g.pdf 2g.pdf)
signed_g.pdf - исходный подписанный файл, выглядит нормально в Acrobat
signed_2g.pdf - объединенный подписанный файл, выглядит как поврежденный в Acrobat

Так это правильное поведение, или что-то не так с Acrobat, pdfunite, itext или мной)))?

Спасибо.


person Vova l    schedule 29.05.2015    source источник
comment
Проверяя с помощью различных инструментов, можно убедиться, что подпись действительна. Что-то подобное обычно происходит с документами, которые заставляют Adobe Reader манипулировать документом при запуске. В таком случае Adobe Reader проверяет измененный документ и, следовательно, обнаруживает недействительную подпись.   -  person mkl    schedule 29.05.2015
comment
Интересный случай, мы рассмотрим его позже. Одна из проблем в 2g.pdf - недопустимый размер в трейлере, в нем указано 110, а наибольший номер объекта - 129. Но исправить это недостаточно.   -  person mkl    schedule 29.05.2015
comment
Вероятно, pdfunite неправильно объединяет файлы. Если вы узнаете, что именно происходит, можно открыть для этого ошибку. Они реально реагируют)   -  person Vova l    schedule 29.05.2015
comment
Как уже упоминалось, одна проблема - это запись Размер, но, вероятно, их больше.   -  person mkl    schedule 29.05.2015


Ответы (1)


Сертификация образца 2g.pdf, используя код OP и проверяя результат другими инструментами, кроме Adobe Reader, получаем информацию о том, что подпись сертификата действительна.

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

То же самое и здесь, 2g.pdf не является полностью допустимым (даже несмотря на то, что синтаксические анализаторы PDF обычно игнорируют): его таблица перекрестных ссылок сегментирована на несколько подразделов:

xref
0 1
0000000001 65535 f
3 2
0000000015 00000 n
0000000107 00000 n
6 41
0000000146 00000 n
...
0000015682 00000 n
48 14
0000015864 00000 n
...
0000025433 00000 n
66 2
0000025455 00000 n
0000025548 00000 n
69 41
0000025588 00000 n
...
0000041144 00000 n
111 14
0000041327 00000 n
...
0000050929 00000 n
126 4
0000050952 00000 n
0000051004 00000 n
0000051075 00000 n
0000051242 00000 n

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

Для файла, который никогда не обновлялся постепенно, раздел перекрестных ссылок должен содержать только один подраздел, нумерация объектов которого начинается с 0.

(раздел 7.5.4 Таблица перекрестных ссылок для ISO 32000-1)

Таким образом, эта сегментированная таблица недействительна.

Поэтому я исправил таблицу перекрестных ссылок, чтобы она содержала только один подраздел (добавив записи f (ree) для оставленных индексов: 2g-fix.pdf. И действительно, при сертификации этого документа с использованием кода OP вы получаете сертификационную подпись, которой доволен Adobe Reader (по крайней мере, версия XI, которую я сейчас установил).

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

person mkl    schedule 30.05.2015
comment
Итак, это ошибка pdfunite, о которой можно сообщить, верно? Кстати, какие еще инструменты PDF могут проверять подписи? - person Vova l; 31.05.2015
comment
Так что это ошибка pdfunite - да, это так. Это вряд ли когда-либо вызовет проблему, но вот она. Какие другие инструменты PDF могут проверять подписи - для начала существует множество веб-сервисов, а затем многие библиотеки PDF предлагают средства для проверки подписи PDF. - person mkl; 31.05.2015
comment
Собственно это не баг, это фича))). Вот строка writeXRefTableTrailer(trailerDict, yRef, gFalse /* do not write unnecessary entries */ в pdfunite.cc. Изменение gFalse на gTrue и удаление not из комментария)) устраняет проблему. - person Vova l; 04.06.2015
comment
На самом деле это не ошибка, это особенность - Ну, эта функция ошибка. - person mkl; 04.06.2015