Interactive Dynamic XFA Widget Runtime

TXFAWidgetRuntime pruža model interakcije neutralan prema hostu za dinamičke XFA obrasce, bez pretvaranja u AcroForm polja ili spljoštavanja njihova sadržaja

Runtime izlaže determinističke granice i stanje widgeta tako da desktop, servis ili prilagođeni renderer može isporučiti vlastiti ulaz, iscrtavanje, pristupačnost i event petlju

Stvori runtime

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

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;

Tvornica za učitani dokument samo čita graf PDF objekata i postojeće XFAFlattenWarnings; spremanje dokumenta zadržava izvorne unose /XFA i /NeedsRendering

Model interakcije

Atomska validacija i izračun

Commit razrješava eksplicitna SOM vezanja i trenutačni kontekst podataka ponovljenog retka prije izvođenja validate i calculate skripti

Uređena vrijednost, izračunate vrijednosti, podatkovni čvorovi, model widgeta, fokus i stanje uređivanja, upozorenja i brojači prolaza objavljuju se zajedno tek nakon što se validacija i raspored stabiliziraju

Odbijene skripte, iscrpljeni proračuni, nevažeće UTF-16 granice odabira te iznimke rasporeda ili hostovog mjerenja vraćaju kompletno prethodno stanje i postavljaju LastDiagnostic

Proračuni

TXFAWidgetRuntimeOptions ograničava broj widgeta, duljinu uređene vrijednosti, prolaze izračuna, prolaze reflowa, operacije rasporeda, operacije skripti, utrošeno vrijeme skripti te druge FormCalc ili JavaScript resurse

Ograničenje widgeta primjenjuje se dok se dodaju stavke rasporeda i fragmenti paginacije, dok učitana XFA dekompresija i sklapanje paketa staju na XFA DOM ulazni limit prije parsiranja

MaxLayoutOperations ima zadanu vrijednost 200000 i ograničava i obilazak dokumenta i rad rasporeda; dubina rasporeda ograničena je na 128, dubina cilja događaja i inicijalizacije instanci na 64, a rekurzivno otpremanje događaja se odbija

Ograničeni dinamički eventi

DispatchEvent prihvaća literalne operacije odvojene točka-zarezom u odgovarajućim event skriptama polja s FormCalc ili JavaScript content typem; te se operacije parsiraju izravno i ne zahtijevaju JavaScript DLL

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

addInstance dodaje jednu instancu i prihvaća true, false, 1 ili 0 kao argument spajanja; izostavljeni argument koristi true, a kratki oblik _row.addInstance(1) također je prihvaćen

Podržani model veže svaku postojeću podatkovnu grupu istog imena, pa nova instanca prima novu podatkovnu grupu inicijaliziranu iz zadanih vrijednosti predloška za bilo koji argument spajanja; stvaranje instance ne klonira unesene vrijednosti prethodnog retka

removeInstance koristi cjelobrojni indeks od nule među podatkovnim grupama istog imena odabranog subforma; subform mora imati occur element s ponovljivim maksimumom, a obje operacije provode njegov minimum i maksimum, uključujući max="-1"

Mutacija instanci zahtijeva implicitno imenovano vezanje dataset-a i ASCII imena XML podataka; eksplicitno vezanje na podatkovnu referencu i dvosmisleni roditeljski konteksti odbijaju se prije objave transakcije

Ciljevi se razrješavaju kroz imenovane podređene elemente predloška u okružujućim opsegima eventa, uključujući točkaste putanje i this.parent; manager ugniježđen unutar ponovljenog opsega koristi vlastitu podatkovnu grupu eventa

presence prihvaća visible, hidden i invisible na poljima predloška, draw elementima, subformama i exclusion grupama; skriveni sadržaj ne zauzima prostor toka, dok nevidljivi sadržaj zadržava svoj prostor i izostavlja se iz widgeta i flatten izlaza

Promjene presence primjenjuju se na odabrani čvor predloška i time na sva njegova ponovljena pojavljivanja; presence po instanci s indeksom, inactive, proizvoljni izrazi, varijable, uvjeti, petlje i druge operacije event skripti odbijaju se

Event serija objavljuje promjene podataka, izračune, raspored, fokus i stanje uređivanja zajedno nakon što se reflow stabilizira; svaka odbijena operacija ili iscrpljeni ulazni, operacijski, instancni, vrijednosni, widget, rasporedni ili vremenski proračun vraća kompletno prethodno stanje dokumenta i interakcije

Uklanjanje retka čuva fokus i neriješene izmjene preživjelih podatkovnih grupa čak i kada se njihovi widget indeksi promijene; uklanjanje ili sakrivanje fokusiranog widgeta briše fokus i po uspjehu objavljuje odgovarajući focus callback

Spremi ažurirani obrazac

SaveToBytes vraća kompletan ažurirani XDP runtimea, uključujući izmijenjene datasete i presence atribute predloška; koristite te bajtove s SetXFADocument prilikom pisanja PDF-a ili s HPDFXFAFlatten za ažurirani flatten izlaz

Tvornica učitanog dokumenta stvara neovisan runtime, pa eventi runtimea ne mijenjaju automatski graf objekata izvornog PDF-a

Aktualne granice

Runtime je host objekt s jednom niti i ne pruža GUI, slikar ni opći XFA event-script motor

Ulazak i izlazak iz fokusa izravno su podržani kada ne postoji odgovarajuća event skripta; ograničene event operacije ne impliciraju podršku za kompletan JavaScript, FormCalc, XFA lifecycle evente ni za zaseban form DOM s prezentacijskim nadjačavanjima po instanci

Vidi Bounded XFA FormCalc and JavaScript, XFA Packet DOM i Interactive Document Processing