Некоторые фоны первые
Обычно PDF файл состоит из заголовка, тела, кросс-справочной информации, и прицеп, смотри рисунок 2 ниже. При обновлении такого файла PDF, у вас есть выбор
- либо строить весь документ заново со всеми изменениями интегрированных (что приводит к PDF снова формируется как оригинал)
- или вы можете присоединить изменения элементов кузова и перекрестные ссылки на документ и добавить новый трейлер, также ссылающийся на прежний трейлер (что приводит к созданию PDF-файла, как показано на рисунке 3 ниже).
Фактически, существуют некоторые формы между ними. Например. некоторые инструменты просто отсекают перекрестные ссылки и трейлер оригинального документа, а затем добавляют новые или измененные элементы кузова, новые полные перекрестные ссылки и новый трейлер без обратной ссылки на какое-то прежнее состояние.
![Structure of an updated PDF file](https://i.stack.imgur.com/ZysKM.png)
(Изображения, скопированные из спецификации PDF ISO 32000-1:2008)
В случае PDF-файлов, сформированная, как на рисунке 3, мы имеем историю различных состояний PDF под руку, каждый начиная с начала файла и дойдя до одного из трейлеров и включая его. Эти состояния обычно называются ревизиями документа, и каждая ревизия документа, очевидно, отражает некоторое состояние формы информации в PDF, которое я предполагаю, это то, что вы называете ревизией AcroFields.
В отличие от вашего предположения, эти изменения не имеют имени как такового. Если вы не используете вторую часть идентификатора (который должен отличаться для разных версий), но AFAIK, который не используется как имя для чего-либо в iText.
Существует некоторая неточность в том месте, где трейлер останавливается, и начинается следующее обновление тела.С одной стороны, есть некоторые варианты, неизбежные в спецификации (различные возможные разрывы строк, игнорирование пробелов, игнорируемые строки комментариев), а с другой стороны, многие производители PDF немного отстают от спецификации. Это в сочетании с промежуточными вариантами между полными и инкрементными обновлениями, упомянутыми выше, может сделать процесс извлечения изменений несколько хлопотным.
Существует специальный вариант пересмотров, который может быть признан с большой степенью надежности: Подписанные версии, то есть изменения, последнее обновление которых содержит встроенную подпись для документа. Поскольку подписанные диапазоны байтов документа должны охватывать всю ревизию документа, но разрыв для самой подписи (по крайней мере, должен быть принят программным обеспечением Adobe и соответствовать стандартам PAdES и PDF-2), точный конец пересмотр в этом случае может быть выведена из информации о подписи:
![Multiple integrated signatures](https://i.stack.imgur.com/GKdYw.jpg)
Более подробную информацию here.
Некоторые ответы на вопросы
Я понимаю, что каждая подпись в PDF-документ применяется к определенному пересмотру AcroFields.
Как упоминалось выше, каждый применяется к определенный пересмотр документа, который затем подразумевает определенное состояние или «ревизию» данных формы.
Каждый раз, когда пользователь меняет какой-либо ввод (т. Е. Заполняя форму pdf), создается новая ревизия.
Не обязательно. Как упоминалось выше, существует множество промежуточных методов для обновлений.
Только при изменении информации о документе, чья последняя ревизия подписана, необходимо соответствующее инкрементное обновление, если эта подпись не должна быть удалена или аннулирована. В противном случае обновитель может получить всю информацию, добавленную после последней подписи, создать собственное обновление с любым контентом, который он пожелает, и добавить это обновление к последней подписанной ревизии документа. Это обновление может содержать даже несколько блоков виртуального обновления с намерением , заставляя вас поверить, что некоторые промежуточные ревизии действительно существовали.
Таким образом, только подписанные версии могут быть как-то надежными, чтобы быть правдой. iText предоставляет только доступ к таким подписанным версиям.
Мой вопрос: как я могу получить все изменения от объекта AcroFields?
Вы можете извлечь все подписанные ревизии документов с использованием
InputStream revisionStream = fields.extractRevision("name");
и открыть их в отдельных случаях PdfReader
. Затем вы можете получить доступ к информации о форме PDF каждого из этих подписанных версий, запросив экземпляр AcroFields
соответствующего PdfReader
, открытого для этой ревизии.
(кстати, то String
аргумент не является именем пересмотра но имя поля подписи, подпись которого подписывает эту ревизию.)
Но как я могу получить все версии (или их имена, по крайней мере)? Я пока не нашел ничего в iText API и в Интернете.
Как упоминалось ранее, эти имена ревизий фактически являются имена полей подписи. Таким образом, вы можете использовать
List<String> names = fields.getSignatureNames()
получить все имена, для которых пересмотр может быть извлечена.
Изменения не названы. (Itext просто связывает подписанную ревизию с именем базовой подписи, а itext по существу не заботится о других версиях.) Itext не сравнивает Revisions. – mkl