|
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
|