|
Регистрирует именованный пакет XFA (XML Forms Architecture) для вывода внутри AcroForm документа /XFA записи. PDF 1.7 §12.7.6 + §12.7.8 позволяет AcroForm нести /XFA массив вместе со статическим /Fields массивом, открывая гибридные сценарии AcroForm + XFA или чисто динамические XFA-формы.
Синтаксис Delphi:
procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);
procedure ClearXFAPackets;
function XFAPacketCount: Integer;
Описание
Каждый вызов AddXFAPacket регистрирует один именованный пакет. Типичные имена (по спецификации XFA 3.3 и таблице 234 §12.7.8 PDF 1.7):
template — раскладка формы + скрипты (самый большой пакет в большинстве XFA-документов).
datasets — привязка данных (XML-наполнение, по которому рендерит template).
config — конфигурация viewer-а.
connectionSet — внешние подключения данных.
localeSet — правила форматирования для локалей.
stylesheet — стилизация XSLT или CSS.
xfdf — наложение данных формы XFDF.
xmpmeta — метаданные XMP.
signature — XFA-данные, связанные с подписью.
sourceSet — определения данных на стороне источника.
При EndDoc каждый зарегистрированный пакет становится одним косвенным потоковым объектом со сжатием FlateDecode, а AcroForm /XFA чередует PDF-строки имён пакетов со ссылками на потоки в порядке регистрации, так что раскладка байт-детерминирована. ClearXFAPackets удаляет все зарегистрированные пакеты (удобно, чтобы гонять один THotPDF экземпляр на несколько документов). XFAPacketCount возвращает текущее число.
Поддержка только на уровне контейнера
HotPDF не не разбирает XFA XML, не не реализует движок динамической раскладки XFA, не не исполняет FormCalc или JavaScript внутри XFA-шаблона и не не проверяет структуру шаблона. XFA XML автор пишет сам (обычно через Adobe LiveCycle Designer или вручную по спецификации XFA 3.3), а HotPDF выдаёт байты дословно.
Читалки с XFA-движком (старые Acrobat / Reader, FormsCentral, некоторые киоск-продукты) рендерят форму; читалки без XFA-движка (Adobe Reader DC с 2017 года, большинство open-source читалок) показывают fallback-поля AcroForm, если документ — гибридный сценарий AcroForm + XFA.
Шлюзы соответствия PDF/A и PDF/X
ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 явно запрещают XFA-формы (движок динамической раскладки недетерминированно архивируем). Допечатные сценарии ISO 15930 отвергают интерактивные формы целиком. AddXFAPacket немедленно бросает исключение при любом непустом PDFACompliance или PDFXCompliance со ссылкой на соответствующую спецификацию. Дубликаты имён пакетов дают исключение. Пустой PacketName или пустой XMLBytes дают исключение. RequirePDFVersion(pdf15) автоматически поднимает версию документа.
Вывод словаря AcroForm
Словарь AcroForm выводится, когда либо /Fields содержит хотя бы одну запись или, либо зарегистрирован хотя бы один XFA-пакет. Вызывающие до v2.119.51, не регистрирующие пакетов, сохраняют байт-в-байт прежний /AcroForm вывод.
Типичный рабочий процесс (чисто динамическая XFA-форма)
PDF.BeginDoc;
TemplateBytes := TFile.ReadAllBytes('form-template.xml');
DataBytes := TFile.ReadAllBytes('form-data.xml');
PDF.AddXFAPacket('xdp:xdp', BytesOf(''));
PDF.AddXFAPacket('template', TemplateBytes);
PDF.AddXFAPacket('datasets', DataBytes);
PDF.AddXFASignaturePacket(SigBytes); { caller-generated XAdES }
PDF.AddXFAPacket('/xdp:xdp', BytesOf(''));
PDF.EndDoc;
XDP-обёртка, однопоточный, динамический и подписанный XFA
Массив /XFA должен открываться и закрываться xdp:xdp wrapper-пакетами, как теперь показывает пример (ISO 32000-1 §12.7.8). Смежные XFA API: SetXFADocument пишет весь XFA/XDP-документ единым /XFA потоком, взаимоисключающим с AddXFAPacket; XFANeedsRendering ставит в Catalog /NeedsRendering флаг (ISO 32000-1 §7.7.2), чтобы viewer пересобрал динамическую XFA-форму при первом открытии; AddXFASignaturePacket встраивает сгенерированную вызывающим подпись XAdES / XML-DSig как signature пакет. HotPDF никогда не генерирует и не разбирает подпись — вызывающий создаёт её XML-криптобиблиотекой поверх XFA datasets.
Сплющивание XFA в AcroForm
ApplyXFAAsAcroForm отображает переданные вызывающим XDP/XFA-байты на текущую страницу как нативные виджеты AcroForm и простую графику страницы. FlattenLoadedXFA выполняет то же преобразование для загруженного PDF, который уже несёт встроенный /XFA пакет. Передайте Editable=False, чтобы сделать созданные виджеты read-only, и смотрите XFAFlattenWarnings на предмет элементов, которые не удалось отобразить.
См. также: Поддержка AcroForm, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField
|