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