Dynamic XFA Instance Presentation
Unit: HPDFXFAPresentation
TXFAInstancePresentation vlastní nezávislý TXFAWidgetRuntime a přidává ohraničený profil instanční prezentace pro dokumenty packetů XDP s jedním záznamem datasetů
Použijte SetPresence('row[1]', 'hidden') k odebrání jednoho výskytu z toku, invisible k ponechání jeho prostoru při utajení jeho widgetů a visible k obnovení; indexy jsou zero-based pozice mezi datovými výskyty, tedy i utajené výskyty
Layout resolver změří každý výskyt samostatně, zhuští přeživší vertikální offsety a zarezervuje kompletní opakovaný rozsah, dřív než umístí následující obsah; pevná výška, výška odvozená z obsahu i řádky tabulek se účastní reflow
Stabilní identita a perzistence
ID widgetů kombinují neprůhledné identity šablony i datasetů a zůstávají stabilní, když se předchozí řádky skryjí či odeberou, po uložení a reloadu i zatímco přeživší pole drží fokus či čekající editace
Helper ukládá namespace kvalifikované atributy identit i instanční override v rozšíření cizího namespace uvnitř form packetu, s použitím urn:hotpdf:xfa:instance-presentation:1; nově přidané řádky dostanou čerstvé identity i šablonové defaulty a odebrané řádky nemohou přenést čekající editace na náhradní řádky
SaveToBytes vrátí kompletní XDP, tedy i aktualizované datasety, identity a stavy prezentace; k perzistenci v PDF použijte THotPDF.SetXFADocument a při zápisu dynamického formuláře nastavte XFANeedsRendering := True
Po reloadu PDF získejte kompletní XDP přes THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes a pak z těch bajtů postavte TXFAInstancePresentation, čímž profil obnovíte
Namespace rozšíření interpretuje tenhle helper; nativní HPDFXFAFlatten, default factory načteného runtime i externí XFA prohlížeče jeho per-instance override automaticky neaplikují, takže trvalé uložení profilu netvrdí identické renderování v jiných čtečkách
Explicitní binding a instanční operace
Opakované subformy se můžou navázat na jinak pojmenovanou skupinu datasetu přes <bind match="dataRef" ref="$record.lines.entry[*]"/>; absolutní kořeny $record a $data i relativní cesty podporují neindexované rodičovské skupiny a finální opakovanou skupinu
Pole uvnitř každého výskytu použijí nativní resolver navázaných hodnot, tedy i explicitní relativní field bindingy jako ref="label"
AddInstance a RemoveInstance aktualizují vybranou datovou skupinu, vynutí minimum i maximum occur, aplikují limity tvorby a přetekají, dřív než publikace; nový řádek dostane hodnoty polí ze šablony, místo aby kopíroval zadané hodnoty předchozího řádku
Selektory použijí unikátní šablonový název s volitelným indexem výskytu, jako row[1]; duplicitní šablonové názvy, chybějící skupiny, neplatné indexy i mutace pod dvojsmyslným opakovaným rodičem transakci odmítnou
SetAccess podporuje open, readOnly, protected a nonInteractive; instanční omezení dědí potomci a brání editaci přes vlastněný runtime
Podmíněné události
DispatchConditionalEvent najde odpovídající událost pole s typem obsahu JavaScript a přímo parsuje ohraničený profil; Execute spustí explicitní skript nad existujícím ID widgetu
if(this.rawValue=="hide"){
row[1].presence="hidden";
}else{
row[1].presence="visible";
}
row.instanceManager.addInstance();
row.instanceManager.removeInstance(0);
Podmínky přijímají rovnost či nerovnost mezi this.rawValue a neescapovaným citovaným literálem; vnořené bloky if ve složených závorkách a volitelné else ohraničuje MaxDepth
Přiřazení podporují presence a access; všechny větve procházejí syntaktickou kontrolou, tedy i nebrané větve a nepodporované operace odmítnou celou dávku
this.rawValue čte potvrzenou hodnotu widgetu; čekající editace zapište přes Runtime.CommitEdit, dřív než dispatchnete událost, která je má vidět
Původní Runtime.DispatchEvent si uchovává omezené chování literálních operací a odmítá podmínkovou i indexovanou instanční syntaxi; tenhle helper neposkytuje obecný interpret JavaScriptu či FormCalc, API prohlížečů, síťový přístup ani automatický dispatch lifecycle XFA
Transakce a rozpočty
Mutace se provádějí přes TXFAWidgetRuntime.UpdateDocument, spolu s nativními výpočty i ohraničeným stabilním reflow; selhání obnoví serializované XDP, fokus, čekající editace, validační stav, počítadla výpočtů a reflow i počet varování
Callbacky fokusu, layoutu i zneplatnění widgetů se publikují až po úspěchu; rozřešení rollbacku potlačí vyčerpanou práci helperu i kontroly zrušení, při zachování nativního layoutu i mezí widgetů, takže zrušení nemůže zabránit obnovení
TXFAPresentationOptions inicializujte přes Default; defaulty jsou 200 000 operací, 4 096 stavů prezentace, 10 000 vytvořených instancí na skupinu, 32 MiB obálky vstupu i dokumentu, 65 536 bajtů skriptu, 32 úrovní vnoření podmínek a 5 000 milisekund
MaxInputBytes navíc ohraničuje konzervativní escapovanou XML obálku, dřív před každým průchodem layoutu i publikací, tedy i atributy identit, deklarace namespace, text a změny datasetů; platný XML může tu konzervativní mez dosáhnout, dřív než jeho serializovaný bajtový počet dosáhne týže hodnoty
Cancelled je volitelný objektově-metodový callback kontrolovaný během ohraničené práce; volby vloženého Runtime dál ohraničují widgety, hodnoty, výpočty, layout, reflow i nativní skriptovou práci
Host malování a přístupnost
Accessibility vrací záznamy viditelných widgetů se stabilním ID, rolí, caption či názvem pole, popiskem tooltipu, potvrzenou hodnotou, stránkou a mezemi, fokusem, platností, stavy read-only a required i popisky voleb; hodnoty hesel se vynechávají
PaintPage dodá snapshot viditelných widgetů i odpovídajících přístupnostních záznamů do TXFAHostWidgetPainter; vlastní hostitelé můžou implementovat vlastní ovládací prvky či renderovací povrch
TXFACanvasWidgetPainter poskytuje skutečné malování na canvas VCL i LCL pro ohraničení widgetů, text, masky hesel, značky checkboxů a radio, indikátory voleb, buttony i fokus, s kladným scale a volitelnými offsety; každý widget ořízne a styly canvasu obnoví
Canvas adaptér maluje widgety a nemaluje kompletní statický grafický strom XFA; hostitel dodá vlastní pozadí stránek, statickou grafiku, routování událostí, prezentaci výběru i přístupnostní most ke své platformě
Runtime i helper jsou single-thread objekty; callbacky musí respektovat vláknové vlastnictví hostitele a vyhýbat se rekurzivním mutacím během aktivní transakce
Volající C++Builder musí dodávat všechny konstruktorové argumenty canvas paintera, jako new TXFACanvasWidgetPainter(canvas, 1, 0, 0); generované hlavičky ty plovoucí defaultní argumenty nedrží
Verifikace
Akceptace pokrývá 106 Delphi case na architekturu, čerstvou kompilaci FPC na obou Windows architekturách, kompilaci veřejných hlaviček C++Builder na Win32 a Win64x i nezávislou validaci skutečného PDF/XDP výstupu
Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp obsahuje nezávislé datové názvy, tři opakované fakturační řádky, podmíněnou událost, metadata pro přístupnost i následující zápatí
Run-XFAInstancePresentationTests.ps1 spustí kontroly helperu i stávající regresní fixtury XFA událostí, runtime, skriptování, SOM, DOM a rozřešení, bez GUI či externích PDF čteček
Nezávislý verify_saved_invoice.py přečte generované PDF přes pypdf a zkontroluje skutečné datové řádky XDP, unikátní perzistentní identity, skrytý stav výskytu, inicializované defaulty i identity reloadu
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
Kompatibilní základní runtime i nativní editační kontrakt popisuje Interactive XFA Widget Runtime