THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

THotPDF XFA forms container (v2.119.51)

 

RegisterAcroFormFont  AcroForm Support

Регистрирует именованный XFA (XML Forms Architecture) packet для вывода внутри записи AcroForm /XFA документа. PDF 1.7 §12.7.6 + §12.7.8 разрешает AcroForm содержать массив /XFA вместе со статическим массивом /Fields или вместо него, что позволяет строить hybrid AcroForm + XFA workflows или чистые dynamic XFA forms

 

Delphi syntax:

procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);

procedure ClearXFAPackets;

function XFAPacketCount: Integer;

 

Описание

Каждый вызов AddXFAPacket регистрирует один именованный packet. Типовые имена согласно XFA 3.3 specification и PDF 1.7 §12.7.8 Table 234:

 

template - form layout + scripts (the largest packet in most XFA documents).

datasets - data binding (the XML payload the template renders against).

config - viewer configuration.

connectionSet - external data connections.

localeSet - locale-specific formatting rules.

stylesheet - XSLT or CSS styling.

xfdf - XFDF form data overlay.

xmpmeta - XMP metadata.

signature - signature-related XFA data.

sourceSet - source-side data definitions.

 

При EndDoc каждый зарегистрированный packet становится одним косвенным FlateDecode-compressed stream object, а массив AcroForm /XFA чередует PDF strings с именами packets и stream references в порядке регистрации, поэтому layout является byte-deterministic. ClearXFAPackets удаляет все зарегистрированные packets, что полезно при повторном использовании экземпляра THotPDF для нескольких документов. XFAPacketCount возвращает текущее количество

 

Container-level support only

HotPDF не разбирает XFA XML, не реализует XFA dynamic-layout engine, не выполняет FormCalc или JavaScript внутри XFA template и не проверяет структуру template. Caller сам создает XFA XML (обычно через Adobe LiveCycle Designer или вручную по XFA 3.3 specification), а HotPDF выводит байты как есть

 

Consumer readers с XFA engine (старые Acrobat / Reader, FormsCentral, некоторые kiosk products) рендерят форму; readers без XFA engine (Adobe Reader DC с 2017 года и большинство open-source readers) показывают fallback AcroForm fields, если документ использует hybrid AcroForm + XFA workflow

 

PDF/A and PDF/X compliance gates

ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 явно запрещают XFA forms, потому что dynamic-layout engine не является детерминированно архивируемым. ISO 15930 prepress workflows полностью отвергают interactive forms. AddXFAPacket немедленно вызывает исключение при любом непустом PDFACompliance или PDFXCompliance с соответствующей ссылкой на спецификацию. Повторяющиеся packet names вызывают исключение. Пустые PacketName или XMLBytes вызывают исключение. RequirePDFVersion(pdf15) автоматически повышает версию документа

 

AcroForm dictionary emission

AcroForm dict выводится, когда /Fields содержит хотя бы одну запись или зарегистрирован хотя бы один XFA packet. Callers до v2.119.51, которые не регистрируют packets, сохраняют byte-identical /AcroForm output

 

Typical workflow (pure XFA dynamic form)

 

PDF.BeginDoc;

TemplateBytes := TFile.ReadAllBytes('form-template.xml');

DataBytes     := TFile.ReadAllBytes('form-data.xml');

PDF.AddXFAPacket('xdp:xdp', BytesOf('<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">'));

PDF.AddXFAPacket('template', TemplateBytes);

PDF.AddXFAPacket('datasets', DataBytes);

PDF.AddXFASignaturePacket(SigBytes); { caller-generated XAdES }

PDF.AddXFAPacket('/xdp:xdp', BytesOf('</xdp:xdp>'));

PDF.EndDoc;

 

XDP wrapper, single-stream, dynamic, and signed XFA

Массивная форма /XFA должна начинаться и заканчиваться обёрточными пакетами xdp:xdp, как теперь показывает пример (ISO 32000-1 §12.7.8). Связанные API XFA: SetXFADocument записывает весь документ XFA/XDP как один поток /XFA, взаимоисключающий с AddXFAPacket; XFANeedsRendering устанавливает флаг /NeedsRendering в каталоге (ISO 32000-1 §7.7.2), чтобы программа просмотра повторно формировала динамическую форму XFA при первом открытии; AddXFASignaturePacket встраивает созданную вызывающей стороной подпись XAdES / XML-DSig как пакет signature. HotPDF никогда не создаёт и не разбирает подпись - её формирует вызывающая сторона с помощью библиотеки XML-криптографии поверх datasets XFA.

 

Сведение XFA в AcroForm

ApplyXFAAsAcroForm сопоставляет переданные вызывающим кодом байты XDP/XFA с текущей страницей как собственные виджеты AcroForm и простую графику. FlattenLoadedXFA выполняет такое же преобразование для загруженного PDF со встроенным пакетом /XFA. Передайте Editable=False, чтобы сделать виджеты доступными только для чтения, и проверьте XFAFlattenWarnings для несопоставленных элементов.

 

См. также: AcroForm Support, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField