THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

THotPDF container φορμών XFA (v2.119.51)

 

RegisterAcroFormFont  AcroForm Support

Καταχωρεί ένα ονομασμένο XFA (XML Forms Architecture) packet για εκπομπή μέσα στην εγγραφή AcroForm /XFA του εγγράφου. Το PDF 1.7 §12.7.6 + §12.7.8 επιτρέπει σε ένα AcroForm να μεταφέρει ένα /XFA array μαζί με (ή αντί για) το στατικό /Fields array, επιτρέποντας υβριδικές ροές AcroForm + XFA ή καθαρά δυναμικές φόρμες XFA

 

Σύνταξη Delphi:

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 - διάταξη φόρμας + scripts (το μεγαλύτερο packet στα περισσότερα XFA έγγραφα)

datasets - data binding (το XML payload πάνω στο οποίο κάνει render το template)

config - διαμόρφωση viewer

connectionSet - εξωτερικές συνδέσεις δεδομένων

localeSet - κανόνες μορφοποίησης ειδικοί για locale

stylesheet - XSLT ή CSS styling

xfdf - XFDF form data overlay

xmpmeta - XMP metadata

signature - δεδομένα XFA που σχετίζονται με υπογραφή

sourceSet - ορισμοί δεδομένων στην πλευρά πηγής

 

Στο EndDoc κάθε καταχωρημένο packet γίνεται ένα indirect FlateDecode-compressed stream object και το AcroForm /XFA array εναλλάσσει PDF strings με ονόματα packet και stream references με τη σειρά καταχώρησης, ώστε η διάταξη να είναι byte-deterministic. Το ClearXFAPackets αφαιρεί όλα τα καταχωρημένα packets (χρήσιμο για επαναχρησιμοποίηση μιας παρουσίας THotPDF σε πολλά έγγραφα). Το XFAPacketCount επιστρέφει τον τρέχοντα αριθμό

 

Υποστήριξη μόνο σε επίπεδο container

Το HotPDF δεν αναλύει το XFA XML, δεν υλοποιεί τον XFA dynamic-layout engine, δεν εκτελεί FormCalc ή JavaScript μέσα στο XFA template και δεν επικυρώνει τη δομή του template. Ο καλών συντάσσει το XFA XML ο ίδιος (συνήθως μέσω Adobe LiveCycle Designer ή χειροκίνητα σύμφωνα με το XFA 3.3 specification) και το HotPDF εκπέμπει τα bytes αυτούσια

 

Οι consumer readers με XFA engine (παλαιότερα Acrobat / Reader, FormsCentral, ορισμένα kiosk products) κάνουν render τη φόρμα. Readers χωρίς XFA engine (Adobe Reader DC από το 2017 και μετά, οι περισσότεροι open-source readers) εμφανίζουν τα fallback AcroForm fields αν το έγγραφο είναι υβριδική ροή 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 forms (ο dynamic-layout engine δεν αρχειοθετείται ντετερμινιστικά). Οι ISO 15930 prepress workflows απορρίπτουν πλήρως τις interactive forms. Το AddXFAPacket κάνει raise αμέσως με τη σχετική spec reference κάτω από οποιοδήποτε μη κενό PDFACompliance ή PDFXCompliance. Τα διπλότυπα packet names κάνουν raise. Κενό PacketName ή κενό XMLBytes κάνει raise. Το RequirePDFVersion(pdf15) ανεβάζει αυτόματα την έκδοση εγγράφου

 

Εκπομπή AcroForm dictionary

Το AcroForm dict εκπέμπεται όταν είτε το /Fields έχει τουλάχιστον μία εγγραφή είτε έχει καταχωρηθεί τουλάχιστον ένα XFA packet. Οι pre-v2.119.51 callers που δεν καταχωρούν packets διατηρούν byte-identical /AcroForm output

 

Τυπική ροή εργασίας (καθαρή 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 και signed XFA

Η φόρμα array /XFA πρέπει να ανοίγει και να κλείνει με xdp:xdp wrapper packets, όπως δείχνει πλέον το παράδειγμα (ISO 32000-1 §12.7.8). Σχετικά XFA APIs: το SetXFADocument γράφει ολόκληρο το XFA/XDP έγγραφο ως ενιαίο /XFA stream και είναι αμοιβαία αποκλειόμενο με το AddXFAPacket. Το XFANeedsRendering θέτει το flag Catalog /NeedsRendering (ISO 32000-1 §7.7.2), ώστε ένας viewer να αναγεννά μια dynamic XFA form στο πρώτο άνοιγμα. Το AddXFASignaturePacket ενσωματώνει υπογραφή XAdES / XML-DSig που παράγεται από τον καλούντα ως packet signature. Το HotPDF δεν παράγει ούτε αναλύει ποτέ την υπογραφή, ο καλών την παράγει με XML cryptographic library πάνω στα XFA datasets

 

Flattening από XFA σε AcroForm

ApplyXFAAsAcroForm αντιστοιχίζει XDP/XFA bytes που παρέχει ο καλών στην τρέχουσα σελίδα ως native AcroForm widgets και απλά page graphics. Το FlattenLoadedXFA εκτελεί την ίδια μετατροπή για φορτωμένο PDF που ήδη μεταφέρει ενσωματωμένο /XFA packet. Περάστε Editable=False για να κάνετε τα generated widgets read-only και ελέγξτε το XFAFlattenWarnings για στοιχεία που δεν μπόρεσαν να αντιστοιχιστούν

 

Δείτε επίσης: AcroForm Support, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField