Διαδραστικό runtime dynamic widget XFA
Το TXFAWidgetRuntime παρέχει ένα μοντέλο αλληλεπίδρασης ουδέτερο ως προς τον host για dynamic φόρμες XFA, χωρίς να τις μετατρέπει σε πεδία AcroForm ή να ισοπεδώνει το περιεχόμενό τους
Το runtime εκθέτει αιτιοκρατικά όρια και κατάσταση widget, ώστε ένας renderer επιφάνειας εργασίας, υπηρεσίας, ή προσαρμοσμένος renderer να εφοδιάζει το δικό του input, σχέδιο, προσβασιμότητα, και event loop
Δημιουργία runtime
Δημιουργήστε το runtime απευθείας από bytes XDP, ή καλέστε την THotPDF.CreateLoadedXFAWidgetRuntime αφού φορτώσετε ένα PDF του οποίου το AcroForm περιέχει μία καταχώρηση /XFA single-stream ή packet-array
var
Runtime: TXFAWidgetRuntime;
State: TXFAWidgetState;
begin
Runtime := PDF.CreateLoadedXFAWidgetRuntime;
try
if (Runtime <> nil) and (Runtime.WidgetCount > 0) then
begin
State := Runtime.Widgets[0];
Runtime.FocusWidget(State.ID);
Runtime.BeginEdit(State.ID);
Runtime.ReplaceSelection(0, Length(State.Value), 'Updated value');
if not Runtime.CommitEdit then
raise Exception.Create(Runtime.LastDiagnostic);
end;
finally
Runtime.Free;
end;
end;
Το factory φορτωμένου εγγράφου είναι read-only ως προς τον γράφο αντικειμένων της PDF και τις υπάρχουσες XFAFlattenWarnings· η αποθήκευση του εγγράφου διατηρεί τις αρχικές του καταχωρήσεις /XFA και /NeedsRendering
Μοντέλο αλληλεπίδρασης
- Οι
FocusWidgetκαιClearFocusδιατηρούν ένα εστιασμένο widget και δημοσιεύουν διατεταγμένα callbacks εστίασης - Οι
BeginEdit,ReplaceSelection,CancelEdit, καιCommitEditδιατηρούν Unicode κείμενο, συμπεριλαμβανομένων των leading και trailing διαστημάτων - Το
HitTestαντιστοιχεί συντεταγμένες σελίδας στο πιο πάνω ορατό widget - Οι
OnWidgetInvalidated,OnLayoutChanged, καιOnFocusChangedεπιτρέπουν στον host να ανανεώνει μόνο την επηρεασμένη κατάσταση
Ατομική επικύρωση και υπολογισμός
Ένα commit αναλύει τις ρητές δεσμεύσεις SOM και το τρέχον data context επαναλαμβανόμενων γραμμών, πριν εκτελέσει τα scripts validate και calculate
Η επεξεργασμένη τιμή, οι υπολογιζόμενες τιμές, οι κόμβοι δεδομένων, το μοντέλο widget, η εστίαση και η κατάσταση επεξεργασίας, οι προειδοποιήσεις, και οι μετρητές περασμάτων δημοσιεύονται μαζί μόνο αφού σταθεροποιηθούν η επικύρωση και το layout
Απορριφθέντα scripts, εξαντλημένοι προϋπολογισμοί, μη έγκυρα όρια επιλογής UTF-16, και εξαιρέσεις layout ή μέτρησης host αποκαθιστούν την πλήρη προηγούμενη κατάσταση και θέτουν το LastDiagnostic
Προϋπολογισμοί
Το TXFAWidgetRuntimeOptions οριοθετεί τον αριθμό widget, το μήκος επεξεργασμένης τιμής, τα περάσματα υπολογισμού, τα περάσματα reflow, τις λειτουργίες layout, τις λειτουργίες script, τον χρόνο εκτέλεσης script, και λοιπούς πόρους FormCalc ή JavaScript
Το όριο widget εφαρμόζεται καθώς προστίθενται στοιχεία layout και θραύσματα σελιδοποίησης, ενώ η αποσυμπίεση φορτωμένου XFA και η συναρμολόγηση packet σταματούν στο όριο input XFA DOM πριν την ανάλυση
Το MaxLayoutOperations έχει προεπιλογή 200000 και φράσσει τόσο το διάβασμα του εγγράφου όσο και το έργο layout· το βάθος layout περιορίζεται στο 128, το βάθος στόχου event και αρχικοποίησης instance στο 64, και η αναδρομική δρομολόγηση events απορρίπτεται
Περιορισμένα δυναμικά events
Η DispatchEvent δέχεται literal λειτουργίες διαχωρισμένες με ερωτηματικά σε matching event scripts πεδίων με περιεχόμενο τύπου FormCalc ή JavaScript· αυτές οι λειτουργίες αναλύονται απευθείας και δεν απαιτούν JavaScript DLL
row.instanceManager.addInstance(true);
row.instanceManager.removeInstance(0);
target.presence = "hidden";
Η addInstance προσθέτει ένα instance στο τέλος και δέχεται true, false, 1, ή 0 ως όρισμα merge· παραλειπόμενο όρισμα σημαίνει true, και η συντομογραφία _row.addInstance(1) γίνεται επίσης δεκτή
Το υποστηριζόμενο μοντέλο συνδέει κάθε υπάρχουσα ομώνυμη ομάδα δεδομένων, ώστε ένα νέο instance να λαμβάνει νέα ομάδα δεδομένων αρχικοποιημένη από τις προεπιλογές του template για όποιο όρισμα merge· η δημιουργία instance δεν κλωνοποιεί τις εισαγόμενες τιμές της προηγούμενης γραμμής
Η removeInstance χρησιμοποιεί ακέραιο δείκτη με βάση το μηδέν ανάμεσα στις ομώνυμες ομάδες δεδομένων του επιλεγμένου subform· το subform πρέπει να έχει στοιχείο occur με επαναλήψιμο μέγιστο, και οι δύο λειτουργίες επιβάλλουν το ελάχιστο και μέγιστό του, συμπεριλαμβανομένου του max="-1"
Η μεταβολή instance απαιτεί έμμεση named δέσμευση dataset και ονόματα δεδομένων XML σε ASCII· η ρητή δέσμευση με data-reference και αμφίσημα γονικά πλαίσια απορρίπτονται πριν τη δημοσίευση της συναλλαγής
Οι στόχοι επιλύονται μέσω ονομασμένων θυγατρικών template στα περικλείοντα scopes του event, συμπεριλαμβανομένων dotted paths και this.parent· ένας manager εμφωλευμένος σε επαναλαμβανόμενο scope χρησιμοποιεί την ίδια την ομάδα δεδομένων του event
Η presence δέχεται visible, hidden, και invisible σε template fields, draws, subforms, και exclusion groups· το κρυφό περιεχόμενο δεν καταλαμβάνει χώρο ροής, ενώ το αόρατο διατηρεί τον χώρο του και παραλείπεται από τα widgets και την έξοδο flatten
Οι αλλαγές presence εφαρμόζονται στον επιλεγμένο κόμβο template και επομένως σε όλες τις επαναλαμβανόμενες εμφανίσεις του· indexed presence ανά instance, inactive, αυθαίρετες εκφράσεις, μεταβλητές, συνθήκες, βρόχοι, και άλλες λειτουργίες event script απορρίπτονται
Μια παρτίδα event δημοσιεύει αλλαγές δεδομένων, υπολογισμούς, layout, εστίαση, και κατάσταση επεξεργασίας μαζί, αφού σταθεροποιηθεί το reflow· κάθε απορριφθείσα λειτουργία ή εξαντλημένος προϋπολογισμός εισόδου, λειτουργιών, instance, τιμής, widget, layout, ή χρόνου αποκαθιστά την πλήρη προηγούμενη κατάσταση εγγράφου και αλληλεπίδρασης
Η αφαίρεση γραμμής διατηρεί εστίαση και εκκρεμείς επεξεργασίες για τις επιζώσες ομάδες δεδομένων, ακόμη όταν αλλάζουν οι δείκτες widget τους· η αφαίρεση ή η απόκρυψη του εστιασμένου widget καθαρίζει την εστίαση και δημοσιεύει το αντίστοιχο callback εστίασης μετά την επιτυχία
Αποθήκευση της ενημερωμένης φόρμας
Η SaveToBytes επιστρέφει το πλήρες ενημερωμένο XDP του runtime, συμπεριλαμβανομένων των τροποποιημένων datasets και των attributes presence του template· χρησιμοποιήστε αυτά τα bytes με το SetXFADocument όταν γράφετε PDF, ή με το HPDFXFAFlatten για την ενημερωμένη έξοδο flatten
Το factory φορτωμένου εγγράφου δημιουργεί ανεξάρτητο runtime, οπότε τα events του runtime δεν τροποποιούν αυτόματα τον γράφο αντικειμένων του πηγαίου PDF
Τρέχοντα όρια
Το runtime είναι ένα single-thread αντικείμενο host και δεν παρέχει GUI, painter, ή γενική μηχανή event-script XFA
Η είσοδος και έξοδος εστίασης υποστηρίζεται απευθείας όταν δεν υπάρχει matching event script· οι περιορισμένες λειτουργίες events δεν συνεπάγονται υποστήριξη πλήρους JavaScript, FormCalc, events κύκλου ζωής XFA, ή ξεχωριστού form DOM με per-instance παρακάμψεις παρουσίασης
Δείτε το Οριοθετημένο XFA FormCalc και JavaScript, το XFA Packet DOM, και την Διαδραστική επεξεργασία εγγράφων