Metoda THotPDF.AddXFAPacket (kontejner formulářů XFA)

THotPDF kontejner formulářů XFA (v2.119.51)

 

RegisterAcroFormFont  Podpora AcroForm

Registruje pojmenovaný paket XFA (XML Forms Architecture) pro emitování uvnitř položky AcroForm /XFA dokumentu PDF 1.7 §12.7.6 + §12.7.8 umožňuje, aby AcroForm nesl pole /XFA vedle statického pole /Fields nebo místo něj, což umožňuje hybridní workflow AcroForm + XFA i čisté dynamické formuláře XFA

 

Syntaxe Delphi:

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

procedure ClearXFAPackets;

function XFAPacketCount: Integer;

 

Popis

Každé volání AddXFAPacket zaregistruje jeden pojmenovaný paket Typické názvy podle specifikace XFA 3.3 a PDF 1.7 §12.7.8 Table 234:

 

template - rozvržení formuláře a skripty, obvykle největší paket v dokumentech XFA

datasets - datová vazba, tedy XML payload, proti němuž se šablona vykresluje

config - konfigurace prohlížeče

connectionSet - externí datová připojení

localeSet - pravidla formátování specifická pro locale

stylesheet - stylování XSLT nebo CSS

xfdf - překryv dat formuláře XFDF

xmpmeta - metadata XMP

signature - data XFA související s podpisem

sourceSet - definice dat na zdrojové straně

 

Při EndDoc se každý registrovaný paket stane jedním nepřímým stream objektem komprimovaným FlateDecode a pole AcroForm /XFA střídá PDF řetězce názvů paketů s odkazy na streamy v pořadí registrace, takže rozvržení je bajtově deterministické ClearXFAPackets odebere všechny registrované pakety, což se hodí při opakovaném použití instance THotPDF pro více dokumentů XFAPacketCount vrací aktuální počet

 

Pouze podpora na úrovni kontejneru

HotPDF neparsuje XML XFA, neimplementuje dynamický layout engine XFA, nespouští FormCalc ani JavaScript uvnitř šablony XFA a nevaliduje strukturu šablony Volající vytváří XML XFA sám (typicky přes Adobe LiveCycle Designer nebo ručně podle specifikace XFA 3.3) a HotPDF emituje bajty beze změny

 

Čtečky s enginem XFA (starší Acrobat / Reader, FormsCentral, některé kioskové produkty) formulář vykreslí Čtečky bez enginu XFA (Adobe Reader DC od roku 2017 a většina open-source čteček) zobrazí fallback pole AcroForm, pokud dokument používá hybridní workflow AcroForm + XFA

 

Brány souladu PDF/A a PDF/X

ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 explicitně zakazují formuláře XFA, protože dynamický layout engine není deterministicky archivovatelný Prepress workflow ISO 15930 odmítají interaktivní formuláře úplně AddXFAPacket při libovolném neprázdném PDFACompliance nebo PDFXCompliance okamžitě vyvolá chybu s odpovídající referencí specifikace Duplicitní názvy paketů, prázdný PacketName nebo prázdné XMLBytes také vyvolají chybu RequirePDFVersion(pdf15) automaticky zvýší verzi dokumentu

 

Emitování slovníku AcroForm

Slovník AcroForm se emituje, když má buď /Fields alespoň jednu položku, nebo je zaregistrován alespoň jeden paket XFA Volající před v2.119.51, kteří neregistrují žádné pakety, zachovají bajtově shodný výstup /AcroForm

 

Typické workflow (čistý dynamický formulář XFA)

 

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;

 

Obal XDP, single-stream, dynamické a podepsané XFA

Forma pole /XFA musí začínat a končit obalovými pakety xdp:xdp, jak ukazuje příklad (ISO 32000-1 §12.7.8) Související API XFA: SetXFADocument zapíše celý dokument XFA/XDP jako jeden stream /XFA a vzájemně se vylučuje s AddXFAPacket; XFANeedsRendering nastaví příznak Catalog /NeedsRendering (ISO 32000-1 §7.7.2), aby prohlížeč při prvním otevření znovu vygeneroval dynamický formulář XFA; AddXFASignaturePacket vloží volajícím vytvořený podpis XAdES / XML-DSig jako paket signature HotPDF podpis nikdy negeneruje ani neparsuje; volající jej vytváří pomocí XML kryptografické knihovny nad datasets XFA

 

Sloučení XFA do AcroForm

ApplyXFAAsAcroForm mapuje volajícím dodané bajty XDP/XFA na aktuální stránku jako nativní widgety AcroForm a jednoduchou stránkovou grafiku FlattenLoadedXFA provede stejnou konverzi pro načtené PDF, které už nese vložený paket /XFA Předáním Editable=False vytvoříte generované widgety jako read-only a v XFAFlattenWarnings zkontrolujete prvky, které nebylo možné namapovat

 

Viz také: Podpora AcroForm, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField