2013-06-18 7 views
4

В настоящее время я работаю над инструментом для применения и проверки цифровых подписей в pdf-документах. Я понимаю, что каждая подпись в pdf-документе применяется к определенной ревизии AcroFields. Каждый раз, когда пользователь меняет какой-либо ввод (т. Е. Заполняя форму pdf), создается новая ревизия.Как получить имена изменений AcroField в iText?

Мой вопрос: как я могу получить все изменения от объекта AcroFields? Я знаю, как получить одного пересмотра в если у меня есть свое имя, как это:

AcroFields fields = ...; 
fields.getRevision("revision1"); 

Но как я могу получить все версии (или их имена, по крайней мере)? Я пока не нашел ничего в iText API и в Интернете.

Я использую iText в версии 2.1.7.

Спасибо и наилучшими пожеланиями, Том

+1

Изменения не названы. (Itext просто связывает подписанную ревизию с именем базовой подписи, а itext по существу не заботится о других версиях.) Itext не сравнивает Revisions. – mkl

ответ

10

Некоторые фоны первые

Обычно PDF файл состоит из заголовка, тела, кросс-справочной информации, и прицеп, смотри рисунок 2 ниже. При обновлении такого файла PDF, у вас есть выбор

  • либо строить весь документ заново со всеми изменениями интегрированных (что приводит к PDF снова формируется как оригинал)
  • или вы можете присоединить изменения элементов кузова и перекрестные ссылки на документ и добавить новый трейлер, также ссылающийся на прежний трейлер (что приводит к созданию PDF-файла, как показано на рисунке 3 ниже).

Фактически, существуют некоторые формы между ними. Например. некоторые инструменты просто отсекают перекрестные ссылки и трейлер оригинального документа, а затем добавляют новые или измененные элементы кузова, новые полные перекрестные ссылки и новый трейлер без обратной ссылки на какое-то прежнее состояние.

Initial structure of a PDF file Structure of an updated PDF file

(Изображения, скопированные из спецификации PDF ISO 32000-1:2008)

В случае PDF-файлов, сформированная, как на рисунке 3, мы имеем историю различных состояний PDF под руку, каждый начиная с начала файла и дойдя до одного из трейлеров и включая его. Эти состояния обычно называются ревизиями документа, и каждая ревизия документа, очевидно, отражает некоторое состояние формы информации в PDF, которое я предполагаю, это то, что вы называете ревизией AcroFields.

В отличие от вашего предположения, эти изменения не имеют имени как такового. Если вы не используете вторую часть идентификатора (который должен отличаться для разных версий), но AFAIK, который не используется как имя для чего-либо в iText.

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

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

Multiple integrated signatures

Более подробную информацию here.

Некоторые ответы на вопросы

Я понимаю, что каждая подпись в PDF-документ применяется к определенному пересмотру AcroFields.

Как упоминалось выше, каждый применяется к определенный пересмотр документа, который затем подразумевает определенное состояние или «ревизию» данных формы.

Каждый раз, когда пользователь меняет какой-либо ввод (т. Е. Заполняя форму pdf), создается новая ревизия.

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

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

Таким образом, только подписанные версии могут быть как-то надежными, чтобы быть правдой. iText предоставляет только доступ к таким подписанным версиям.

Мой вопрос: как я могу получить все изменения от объекта AcroFields?

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

InputStream revisionStream = fields.extractRevision("name"); 

и открыть их в отдельных случаях PdfReader. Затем вы можете получить доступ к информации о форме PDF каждого из этих подписанных версий, запросив экземпляр AcroFields соответствующего PdfReader, открытого для этой ревизии.

(кстати, то String аргумент не является именем пересмотра но имя поля подписи, подпись которого подписывает эту ревизию.)

Но как я могу получить все версии (или их имена, по крайней мере)? Я пока не нашел ничего в iText API и в Интернете.

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

List<String> names = fields.getSignatureNames() 

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

+0

Отлично! Спасибо за подробный ответ. Это пролило на меня много света. – Tom

 Смежные вопросы

  • Нет связанных вопросов^_^