Interaktivni dinamički XFA Widget Runtime

TXFAWidgetRuntime pruža host-neutralan model interakcije za dinamičke XFA forme bez njihovog pretvaranja u AcroForm polja ili poravnavanja njihovog sadržaja

Runtime izlaže determinističke granice i stanje widget-a, tako da desktop, servis ili prilagođeni renderer može da obezbedi svoj ulaz, crtanje, pristupačnost i petlju događaja

Kreiranje runtime-a

Kreirajte runtime direktno iz XDP bajtova ili pozovite THotPDF.CreateLoadedXFAWidgetRuntime nakon učitavanja PDF-a čiji AcroForm sadrži /XFA unos s jednim tokom ili nizom paketa

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;

Fabrika učitanog dokumenta je samo-čitljiva u odnosu na PDF objektni graf i postojeća XFAFlattenWarnings; čuvanje dokumenta zadržava njegove originalne /XFA i /NeedsRendering unose

Model interakcije

Atomska validacija i izračunavanje

Izdavanje rešava eksplicitna SOM vezivanja i trenutni kontekst podataka ponovljenih redova pre pokretanja skripti validacije i izračunavanja

Izmenjena vrednost, izračunate vrednosti, čvorovi podataka, model widget-a, stanje fokusa i izmene, upozorenja i brojači prolaza objavljuju se zajedno tek nakon što se validacija i raspored stabilizuju

Odbijene skripte, iscrpljeni budžeti, nevažeće UTF-16 granice selekcije i izuzeci rasporeda ili host-merenja vraćaju kompletno prethodno stanje i postavljaju LastDiagnostic

Budžeti

TXFAWidgetRuntimeOptions ograničava broj widget-a, dužinu izmenjene vrednosti, prolaze izračunavanja, prolaze prekomponovanja, operacije rasporeda, operacije skripti, proteklo vreme skripte i druge FormCalc ili JavaScript resurse

Kapacitet widget-a se primenjuje dok se dodaju stavke rasporeda i fragmenti paginacije, dok se dekodiranje učitanog XFA-a i sklapanje paketa zaustavljaju na ulaznom limitu XFA DOM-a pre analize

MaxLayoutOperations je podrazumevano 200000 i ograničava i obilazak dokumenta i rad na rasporedu; dubina rasporeda je ograničena na 128, dubina cilja događaja i inicijalizacije instance na 64, a rekurzivno otpremanje događaja se odbacuje

Ograničeni dinamički događaji

DispatchEvent prihvata literalne operacije razdvojene tačka-zarezom u odgovarajućim skriptama događaja polja sa FormCalc ili JavaScript tipom sadržaja; ove operacije se parsiraju direktno i ne zahtevaju JavaScript DLL

row.instanceManager.addInstance(true);
row.instanceManager.removeInstance(0);
target.presence = "hidden";

addInstance dodaje jednu instancu i prihvata true, false, 1 ili 0 kao merge argument; izostavljeni argument koristi true, a prihvaćena je i skraćenica _row.addInstance(1)

Podržani model vezuje svaku postojeću podatkovnu grupu sa istim imenom, tako da nova instanca dobija novu podatkovnu grupu inicijalizovanu iz podrazumevanih vrednosti šablona za bilo koji merge argument; stvaranje instance ne klonira unete vrednosti prethodnog reda

removeInstance koristi celobrovni indeks od nule među podatkovnim grupama istog imena izabranog subform-a; subform mora imati occur element sa ponovljivim maksimumom, a obe operacije provedu njegov minimum i maksimum, uključujući max="-1"

Mutacija instance zahteva implicitno vezivanje imenovanog skupa podataka i ASCII imena XML podataka; eksplicitno vezivanje referencom na podatke i dvosmisleni roditeljski konteksti odbacuju se pre objavljivanja transakcije

Ciljevi se razrešavaju kroz imenovanu decu šablona u obuhvatajućim oblasti događaja, uključujući tačkaste putanje i this.parent; menadžer ugnježđen u ponovljivu oblast koristi sopstvenu podatkovnu grupu događaja

presence prihvata visible, hidden i invisible na poljima šablona, draw elementima, subform-ama i exclusion grupama; skriveni sadržaj ne zauzima prostor u toku, dok nevidljivi sadržaj zadržava svoj prostor i izostavlja se iz widget-a i flatten izlaza

Izmene prisustva primenjuju se na izabrani čvor šablona i time na sve njegove ponovljene pojave; indeksirano prisustvo po instanci, inactive, proizvoljni izrazi, promenljive, uslovi, petlje i druge operacije skripti događaja se odbacuju

Grupa događaja objavljuje izmene podataka, izračunavanja, raspored, fokus i stanje uređivanja zajedno nakon što se prekomponovanje stabilizuje; svaka odbijena operacija ili iscrpljen budžet ulaza, operacija, instanci, vrednosti, widget-a, rasporeda ili proteklog vremena vraća kompletno prethodno stanje dokumenta i interakcije

Uklanjanje reda čuva fokus i započete izmene preživelih podatkovnih grupa čak i kada se njihovi indeksi widget-a promene; uklanjanje ili sakrivanje fokusiranog widget-a briše fokus i nakon uspeha objavljuje odgovarajući povratni poziv fokusa

Čuvanje ažurirane forme

SaveToBytes vraća kompletan ažurirani XDP runtime-a, uključujući izmenjene skupove podataka i atribute prisustva šablona; ove bajtove koristite sa SetXFADocument pri pisanju PDF-a ili sa HPDFXFAFlatten za ažurirani flatten izlaz

Fabrika učitanog dokumenta stvara nezavisni runtime, pa događaji runtime-a automatski ne menjaju objektni graf izvornog PDF-a

Trenutne granice

Runtime je jedno-nićni host objekat i ne obezbeđuje GUI, slikara ili opšti XFA mehanizam skripti događaja

Ulazak i izlazak fokusa podržani su direktno kada ne postoji odgovarajuća skripta događaja; ograničene operacije događaja ne podrazumevaju podršku za kompletan JavaScript, FormCalc, XFA događaje životnog ciklusa ili poseban form DOM sa izmenama prikaza po instanci

Vidi Ograničeni XFA FormCalc i JavaScript, XFA Packet DOM i Interaktivna obrada dokumenata