Dynamiczna prezentacja instancji XFA

Jednostka: HPDFXFAPresentation

TXFAInstancePresentation posiada niezależną TXFAWidgetRuntime i dodaje ograniczony profil prezentacji instancji dla dokumentów pakietów XDP z jednym rekordem datasets

Użyj SetPresence('row[1]', 'hidden'), aby usunąć jedno wystąpienie z przepływu, invisible, by zachować jego miejsce ukrywając jego widgety, i visible, by je przywrócić; indeksy to pozycje od zera wśród wystąpień danych, łącznie z wystąpieniami ukrytymi

Rozwiązujący layout mierzy każde wystąpienie osobno, kompaktuje przetrwałe offsety pionowe i rezerwuje kompletny powtórzony zasięg przed umieszczeniem zawartości następującej; wiersze o stałej wysokości, wysokości z zawartości i wiersze tabel uczestniczą w reflow

Stabilna tożsamość i trwałość

ID widgetów łączą nieprzezroczyste tożsamości szablonu i datasets i pozostają stabilne przy ukrywaniu albo usuwaniu poprzedzających wierszy, po zapisie i ponownym wczytaniu oraz podczas gdy przetrwałe pola zachowują fokus albo oczekujące edycje

Helper przechowuje kwalifikowane przestrzenią nazw atrybuty tożsamości i nadpisania instancji w rozszerzeniu obcej przestrzeni nazw wewnątrz pakietu form, używając urn:hotpdf:xfa:instance-presentation:1; nowo dodane wiersze dostają świeże tożsamości i domyślne wartości szablonu, a usunięte wiersze nie mogą przekazywać oczekujących edycji wierszom zastępczym

SaveToBytes zwraca kompletny XDP, włącznie z zaktualizowanymi datasets, tożsamościami i stanami prezentacji; użyj THotPDF.SetXFADocument, by utrwalić go w PDF i ustaw XFANeedsRendering := True przy zapisie formularza dynamicznego

Po ponownym wczytaniu PDF uzyskaj kompletny XDP przez THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes, potem skonstruuj TXFAInstancePresentation z tych bajtów, aby przywrócić ten profil

Rozszerzenie przestrzeni nazw jest interpretowane przez ten helper; natywny HPDFXFAFlatten, domyślna fabryka runtime wczytanych dokumentów i zewnętrzne czytniki XFA nie stosują automatycznie jego nadpisań per-instancja, więc trwałe przechowanie profilu nie asertuje identycznego renderowania w innych czytnikach

Jawne bindowanie i operacje na instancjach

Powtórzone subformularze mogą bindować się do inaczej nazwanej grupy datasets przez <bind match="dataRef" ref="$record.lines.entry[*]"/>; absolutne korzenie $record i $data oraz ścieżki względne wspierają niezaindeksowane grupy rodziców i finalną powtórzoną grupę

Pola wewnątrz każdego wystąpienia używają natywnego rozwiązywacza zbindowanych wartości, łącznie z jawnymi względnymi bindowaniami pól takimi jak ref="label"

AddInstance i RemoveInstance aktualizują wybraną grupę danych, wymuszają minimum i maksimum occur, stosują limity tworzenia i wykonują reflow przed publikacją; nowy wiersz otrzymuje wartości pól z szablonu zamiast kopiować wprowadzone wartości z poprzedniego wiersza

Selektory używają unikalnej nazwy szablonu z opcjonalnym indeksem wystąpienia, takiej jak row[1]; zduplikowane nazwy szablonów, brakujące grupy, niepoprawne indeksy i mutacje pod niejednoznacznym powtórzonym rodzicem odrzucają transakcję

SetAccess wspiera open, readOnly, protected i nonInteractive; ograniczenia instancji są dziedziczone przez potomków i uniemożliwiają edycję przez posiadaną runtime

Zdarzenia warunkowe

DispatchConditionalEvent lokalizuje pasujące zdarzenie pola o typie zawartości JavaScript i parsuje ograniczony profil bezpośrednio; Execute wykonuje jawny skrypt względem istniejącego ID widgetu

if(this.rawValue=="hide"){
  row[1].presence="hidden";
}else{
  row[1].presence="visible";
}
row.instanceManager.addInstance();
row.instanceManager.removeInstance(0);

Warunki przyjmują równość albo nierówność między this.rawValue a nieeskapowanym cytowanym literałem; zagnieżdżone bloki if w klamrach i opcjonalne bloki else są ograniczone przez MaxDepth

Przypisania wspierają presence i access; wszystkie gałęzie są sprawdzane składniowo, włącznie z gałęziami niewykonanymi, a nieobsługiwane operacje odrzucają cały batch

this.rawValue odczytuje zatwierdzoną wartość widgetu; zatwierdź oczekujące edycje przez Runtime.CommitEdit przed dyspozycją zdarzenia, które ma je obserwować

Oryginalny Runtime.DispatchEvent zachowuje swoje ograniczone zachowanie operacji literałowych i odrzuca składnię warunkową i indeksowanych instancji; ten helper nie dostarcza ogólnego interpretera JavaScript ani FormCalc, API przeglądarki, dostępu sieciowego ani automatycznej dyspozycji cyklu życia XFA

Transakcje i budżety

Mutacje wykonują się przez TXFAWidgetRuntime.UpdateDocument, razem z natywnymi obliczeniami i ograniczonym stabilnym reflow; niepowodzenie przywraca zserializowany XDP, fokus, oczekujące edycje, stan walidacji, liczniki obliczeń i reflow oraz liczbę ostrzeżeń

Callbacki fokusa, layoutu i unieważnienia widgetów publikują dopiero po sukcesie; rozwiązywanie rollbacku wycisza wyczerpaną pracę helpera i kontrole anulowania, zachowując natywny layout i granice widgetów, żeby anulowanie nie mogło uniemożliwić odtworzenia

Inicjalizuj TXFAPresentationOptions przez Default; wartości domyślne to 200,000 operacji, 4,096 stanów prezentacji, 10,000 utworzonych instancji na grupę, 32 MiB wejścia i koperty dokumentu, 65,536 bajtów skryptów, 32 poziomy zagnieżdżenia warunkowego i 5,000 milisekund

MaxInputBytes ogranicza też konserwatywną kopertę XML po eskapowaniu przed każdym przejściem layoutu i publikacji, włącznie z atrybutami tożsamości, deklaracjami przestrzeni nazw, tekstem i zmianami datasets; poprawny XML może osiągnąć tę konserwatywną granicę, zanim jego zserializowana liczba bajtów osiągnie tę samą wartość

Cancelled to opcjonalny callback metody obiektu sprawdzany podczas ograniczonej pracy; osadzone opcje Runtime nadal ograniczają widgety, wartości, obliczenia, layout, reflow i natywną pracę skryptów

Malowanie hosta i dostępność

Accessibility zwraca rekordy widocznych widgetów ze stabilnym ID, rolą, podpisem albo nazwą pola, opisem podpowiedzi, zatwierdzoną wartością, stroną i granicami, fokusem, poprawnością, stanami read-only i required oraz etykietami wyborów; wartości haseł są pomijane

PaintPage dostarcza snapshot widocznych widgetów i odpowiadających rekordów dostępności do TXFAHostWidgetPainter; własne hosty mogą implementować swoje kontrolki albo powierzchnię renderowania

TXFACanvasWidgetPainter dostarcza rzeczywiste malowanie na canvas VCL i LCL dla ramek widgetów, tekstu, maskowania haseł, znaczników checkbox i radio, wskaźników wyboru, przycisków i fokusa, z dodatnim skalowaniem i opcjonalnymi offsetami; przycina każdy widget i przywraca style canvas

Adapter canvas maluje widgety i nie maluje pełnego statycznego drzewa grafiki XFA; host dostarcza własne tło strony, statyczną grafikę, routing zdarzeń, prezentację zaznaczenia i most dostępności do swojej platformy

Runtime i helper są obiektami jednowątkowymi; callbacki muszą podążać za własnością wątków hosta i unikać rekurencyjnych mutacji podczas aktywnej transakcji

Wywołujący C++Builder muszą podać wszystkie argumenty konstruktora malarza canvas, takie jak new TXFACanvasWidgetPainter(canvas, 1, 0, 0); wygenerowane nagłówki nie zachowują tych domyślnych argumentów zmiennoprzecinkowych

Weryfikacja

Akceptacja obejmuje 106 przypadków Delphi na architekturę, świeżą kompilację FPC na obu architekturach Windows, kompilację publicznych nagłówków C++Builder na Win32 i Win64x oraz niezależną walidację rzeczywistego wyjścia PDF/XDP

Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp zawiera niezależne nazwy danych, trzy powtórzone linie faktury, zdarzenie warunkowe, metadane dostępności i następującą stopkę

Run-XFAInstancePresentationTests.ps1 uruchamia kontrole helpera i istniejące fiksatury regresji zdarzeń XFA, runtime, skryptowania, SOM, DOM i rozwiązywania bez GUI i zewnętrznych czytników PDF

Niezależny verify_saved_invoice.py odczytuje wygenerowany PDF przez pypdf i sprawdza rzeczywiste wiersze danych XDP, unikalne trwałe tożsamości, stan wystąpień ukrytych, zainicjalizowane domyślne wartości i tożsamości po przeładowaniu

powershell -File Tests/Delphi/Run-XFAInstancePresentationTests.ps1 -Platform Win32 -CheckCppHeaders
powershell -File Tests/Delphi/Run-XFAInstancePresentationTests.ps1 -Platform Win64 -CheckCppHeaders
python Tests/Fixtures/XFAInstancePresentation/verify_saved_invoice.py

Zobacz Interaktywny runtime widgetów XFA dla zgodnej runtime bazowej i natywnego kontraktu edycji