|
Registreert een benoemd XFA-pakket (XML Forms Architecture) voor opname in het /XFA-item van de AcroForm van het document. PDF 1.7 §12.7.6 + §12.7.8 laat een AcroForm een /XFA-array naast, of in plaats van, de statische /Fields-array dragen, wat hybride AcroForm + XFA-workflows of pure dynamische XFA-formulieren mogelijk maakt
Delphi-syntaxis:
procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);
procedure ClearXFAPackets;
function XFAPacketCount: Integer;
Beschrijving
Elke aanroep van AddXFAPacket registreert één benoemd pakket. Typische namen (volgens de XFA 3.3-specificatie en PDF 1.7 §12.7.8 tabel 234):
template - formulierindeling + scripts (het grootste pakket in de meeste XFA-documenten)
datasets - databinding (de XML-payload waartegen de template rendert)
config - viewerconfiguratie
connectionSet - externe dataverbindingen
localeSet - locale-specifieke opmaakregels
stylesheet - XSLT- of CSS-opmaak
xfdf - XFDF-overlaag voor formuliervelden
xmpmeta - XMP-metadata
signature - XFA-gegevens met betrekking tot handtekeningen
sourceSet - gegevensdefinities aan de bronzijde
Bij EndDoc wordt elk geregistreerd pakket één indirect, met FlateDecode gecomprimeerd streamobject en de AcroForm /XFA-array wisselt pakketnaam-PDF-strings af met streamverwijzingen in registratier volgorde, zodat de lay-out byte-deterministisch is. ClearXFAPackets verwijdert alle geregistreerde pakketten, wat handig is wanneer één THotPDF-instantie over meerdere documenten wordt hergebruikt. XFAPacketCount geeft de huidige telling terug
Alleen ondersteuning op containerniveau
HotPDF parseert de XFA-XML niet, implementeert de XFA-dynamische lay-outengine niet, voert geen FormCalc of JavaScript uit in de XFA-template en valideert de templatestructuur niet. De aanroeper schrijft de XFA-XML zelf, meestal via Adobe LiveCycle Designer of handmatig volgens de XFA 3.3-specificatie, en HotPDF geeft de bytes letterlijk door
Leesprogramma's met een XFA-engine (oudere Acrobat / Reader, FormsCentral, sommige kioskproducten) renderen het formulier; lezers zonder XFA-engine (Adobe Reader DC vanaf 2017, de meeste opensource-readers) tonen de fallback-AcroFormvelden als het document een hybride AcroForm + XFA-workflow is
Conformiteitscontroles voor PDF/A en PDF/X
ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 verbieden XFA-formulieren expliciet, omdat de dynamische lay-outengine niet deterministisch te archiveren is. ISO 15930-prepressworkflows weigeren interactieve formulieren volledig. AddXFAPacket geeft direct een uitzondering bij elke niet-lege PDFACompliance of PDFXCompliance met de relevante specificatiereferentie. Dubbele pakketnamen geven een uitzondering. Een lege PacketName of lege XMLBytes geeft een uitzondering. RequirePDFVersion(pdf15) verhoogt de documentversie automatisch
Uitgifte van de AcroForm-dictionary
De AcroForm-dict wordt uitgegeven wanneer ofwel /Fields ten minste één item bevat of ten minste één XFA-pakket is geregistreerd. Aanroepers van vóór v2.119.51 die geen pakketten registreren, behouden byte-identieke /AcroForm-uitvoer
Typische workflow (puur dynamisch XFA-formulier)
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, dynamische en ondertekende XFA
De array-vorm van /XFA moet beginnen en eindigen met xdp:xdp-wrapperpakketten, zoals het voorbeeld laat zien (ISO 32000-1 §12.7.8). Verwante XFA-API's: SetXFADocument schrijft het hele XFA/XDP-document als één /XFA-stream, wederzijds exclusief met AddXFAPacket; XFANeedsRendering zet de Catalog-vlag /NeedsRendering aan (ISO 32000-1 §7.7.2) zodat een viewer een dynamisch XFA-formulier bij de eerste opening opnieuw genereert; AddXFASignaturePacket voegt een door de aanroeper gemaakte XAdES-/XML-DSig-handtekening toe als het signature-pakket. HotPDF genereert of parseert de handtekening nooit - de aanroeper maakt die met een XML-cryptobibliotheek over de XFA-datasets
XFA naar AcroForm afvlakken
ApplyXFAAsAcroForm zet door de aanroeper geleverde XDP/XFA-bytes op de huidige pagina om naar native AcroForm-widgets en eenvoudige paginagrafiek. FlattenLoadedXFA doet dezelfde conversie voor een geladen PDF met een ingebed /XFA-pakket. Geef Editable=False door om widgets alleen-lezen te maken en controleer XFAFlattenWarnings op niet-gemapte elementen
Zie ook: AcroForm-ondersteuning, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField
|