Διαδραστικό 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

Μοντέλο αλληλεπίδρασης

Ατομική επικύρωση και υπολογισμός

Ένα 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, και την Διαδραστική επεξεργασία εγγράφων