Что такое AcroForm
AcroForm — механизм заполняемых форм в PDF. Он состоит из двух половин: поле хранит имя и значение, а виджет — прямоугольник на странице и поток внешнего вида, то есть готовый рисунок того, как это значение выглядит. У одного поля может быть несколько виджетов, если оно повторяется на разных страницах. Сведение формы переносит рисунок в содержимое страницы и снимает интерактивность.
Коротко о цифрах
- Поле и виджет
- значение хранится в поле, внешний вид — в виджете; виджетов может быть несколько
- Сведение
- внешний вид переносится в содержимое страницы, интерактивность снимается
- Несведённые поля
- возвращаются списком полных имён и остаются интерактивными
- Аннотации
- штампы и заметки запекаются и удаляются; ссылки остаются намеренно
- Кириллица в значении
- перерисовывается вшитым шрифтом, а не стандартным Helvetica
Поле, виджет и внешний вид
Поля образуют дерево с полными именами вида «Раздел.Фамилия»: так форма собирает связанные значения и так же на них ссылаются скрипты. Виджеты живут среди аннотаций страницы и отвечают за геометрию: где рамка, какого она размера, что нарисовано внутри. Пока эти половины связаны, программа-просмотрщик даёт вводить текст и ставить галочки.
Поток внешнего вида часто нарисован в собственной системе координат со своей рамкой и матрицей преобразования. Спецификация требует вписать преобразованную рамку в прямоугольник аннотации — иначе штампы и графические подписи при сведении уезжают или меняют масштаб. Это тонкость, которую легко не заметить, пока в документе только текстовые поля.
Что происходит при сведении
- Внешний вид каждого поля рисуется прямо в содержимом страницы: значение остаётся видимым, но перестаёт быть значением.
- Штампы, заметки и выделения запекаются так же и удаляются из файла — текст комментария исчезает из документа, а не прячется за картинкой самого себя.
- Ссылки намеренно оставлены: у них нет внешнего вида, а удаление сломало бы навигацию без всякой пользы.
- Поля, внешний вид которых разобрать не удалось, остаются интерактивными и возвращаются списком имён: тихо назвать документ сведённым значило бы обмануть.
Почему готовая функция библиотеки не используется
- Она работает по принципу «всё или ничего»: падает на первом непонятном виджете, уже переписав страницы предыдущих полей, и один осиротевший виджет стоит всего документа.
- Внешний вид она перерисовывает стандартным шрифтом с кодировкой WinAnsi — любое кириллическое значение немедленно даёт ошибку кодирования.
- Она игнорирует собственную рамку и матрицу потока, а значит, портит именно штампы и графические подписи.
- Наша реализация сначала разбирает поле целиком и применяет его, только если разобрались все виджеты; кириллицу повторно рисует вшитым шрифтом.
Частые вопросы
Зачем сводить форму, если она и так заполнена?
Чтобы значения нельзя было изменить и чтобы они одинаково выглядели везде. Незаполненная программа-просмотрщик может перерисовать поле по-своему, а в сведённом документе на странице лежит обычная графика.
Что будет с кириллическим значением поля?
Оно перерисовывается вшитым шрифтом с нужным набором глифов. Стандартный шрифт формы в такой ситуации бросил бы ошибку кодирования, и поле осталось бы пустым прямоугольником.
Можно ли вернуть форме интерактивность после сведения?
Нет. Поля и виджеты удалены, а на их месте лежит рисунок. Единственный путь назад — исходный файл до сведения, поэтому его стоит сохранять отдельно.
Почему часть полей осталась заполняемой?
Их внешний вид не удалось разобрать: виджет мог остаться без страницы или без потока рисования. Такие поля инструмент перечисляет по именам, чтобы вы решили, что с ними делать, вместо того чтобы молча испортить документ.