|
Καταχωρεί ένα ονομασμένο 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
|