Dynamische XFA-Instanzdarstellung

Unit: HPDFXFAPresentation

TXFAInstancePresentation besitzt eine unabhängige TXFAWidgetRuntime und ergänzt ein begrenztes Instanzdarstellungsprofil für XDP-Paketdokumente mit einem datasets-Record

Mit SetPresence('row[1]', 'hidden') nehmen Sie ein Vorkommen aus dem Fluss, invisible bewahrt seinen Platz, während seine Widgets verborgen bleiben, und visible stellt es wieder her; Indizes sind nullbasierte Positionen unter den Datenvorkommen, einschließlich verborgener Vorkommen

Der Layout-Resolver misst jedes Vorkommen separat, verdichtet verbleibende vertikale Versätze und reserviert die vollständige wiederholte Ausdehnung, bevor nachfolgender Inhalt platziert wird; Zeilen mit fester Höhe, inhaltsabgeleiteter Höhe und Tabellenzeilen nehmen am Reflow teil

Stabile Identität und Persistenz

Widget-IDs verbinden opake Template- und datasets-Identitäten und bleiben stabil, wenn vorherige Zeilen verborgen oder entfernt werden, nach Speichern und Neuladen sowie während überlebende Felder Fokus oder Pending Edits halten

Der Helfer speichert namespace-qualifizierte Identitätsattribute und Instanz-Overrides in einer Fremd-Namespace-Erweiterung innerhalb des Formularpakets, unter urn:hotpdf:xfa:instance-presentation:1; neu hinzugefügte Zeilen bekommen frische Identitäten und Template-Defaults, und entfernte Zeilen können keine Pending Edits an Ersatzzeilen weitergeben

SaveToBytes liefert das vollständige XDP zurück, einschließlich aktualisierter datasets, Identitäten und Darstellungszustände; verwenden Sie THotPDF.SetXFADocument, um es in einer PDF zu persistieren, und setzen Sie XFANeedsRendering := True, wenn Sie ein dynamisches Formular schreiben

Nach dem PDF-Neuladen holen Sie das vollständige XDP mit THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes und konstruieren daraus TXFAInstancePresentation, um dieses Profil wiederherzustellen

Die Namespace-Erweiterung wird von diesem Helfer interpretiert; natives HPDFXFAFlatten, die Default-Factory für geladene Runtimes und externe XFA-Viewer wenden ihre Instanz-Overrides nicht automatisch an, daher garantiert das dauerhafte Speichern des Profils keine identische Darstellung in anderen Readern

Explizites Binding und Instanzoperationen

Wiederholte Subforms können sich mit <bind match="dataRef" ref="$record.lines.entry[*]"/> an eine anders benannte dataset-Gruppe binden; absolute $record- und $data-Wurzeln und relative Pfade unterstützen unindizierte Elterngruppen und eine abschließende wiederholte Gruppe

Felder innerhalb jedes Vorkommens nutzen den nativen Bound-Value-Resolver, einschließlich expliziter relativer Feldbindungen wie ref="label"

AddInstance und RemoveInstance aktualisieren die gewählte Datengruppe, setzen occur-Minimum und -Maximum durch, wenden Erzeugungslimits an und führen vor der Veröffentlichung einen Reflow aus; die neue Zeile bekommt Feldwerte aus dem Template, statt eingegebene Werte aus der vorherigen Zeile zu kopieren

Selektoren verwenden einen eindeutigen Template-Namen mit optionalem Vorkommensindex, etwa row[1]; doppelte Template-Namen, fehlende Gruppen, ungültige Indizes und Mutationen unter einem mehrdeutigen wiederholten Elternteil weisen die Transaktion zurück

SetAccess unterstützt open, readOnly, protected und nonInteractive; Instanzbeschränkungen werden an Nachkommen vererbt und verhindern Editing über die eigene Runtime

Konditionale Events

DispatchConditionalEvent findet ein passendes Feld-Event mit JavaScript-Content-Type und parst das begrenzte Profil direkt; Execute führt ein explizites Skript gegen eine vorhandene Widget-ID aus

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

Bedingungen akzeptieren Gleichheit oder Ungleichheit zwischen this.rawValue und einem nicht escapten quotierten Literal; verschachtelte if-Blöcke in geschweiften Klammern und optionale else-Blöcke sind durch MaxDepth begrenzt

Zuweisungen unterstützen presence und access; alle Zweige werden syntaxgeprüft, auch nicht durchlaufene, und nicht unterstützte Operationen weisen den gesamten Batch zurück

this.rawValue liest den committeten Widget-Wert; committen Sie Pending Edits über Runtime.CommitEdit, bevor Sie ein Event ausliefern, das sie beobachten soll

Das ursprüngliche Runtime.DispatchEvent behält sein eingeschränktes Literal-Operationsverhalten und weist konditionale und indizierte Instanzsyntax ab; dieser Helfer bietet keinen allgemeinen JavaScript- oder FormCalc-Interpreter, keine Browser-APIs, keinen Netzwerkzugriff und kein automatisches XFA-Lifecycle-Dispatching

Transaktionen und Budgets

Mutationen laufen über TXFAWidgetRuntime.UpdateDocument, zusammen mit nativen Berechnungen und begrenztem stabilem Reflow; ein Fehler stellt serialisiertes XDP, Fokus, Pending Edits, Validierungszustand, Berechnungs- und Reflow-Zähler sowie die Warnanzahl wieder her

Fokus-, Layout- und Widget-Invalidierungs-Callbacks werden erst nach Erfolg veröffentlicht; die Rollback-Auflösung unterdrückt ausgeschöpfte Helfer-Arbeit und Abbruchprüfungen, behält aber natives Layout und Widgetgrenzen bei, sodass Abbruch die Wiederherstellung nicht verhindern kann

Initialisieren Sie TXFAPresentationOptions mit Default; die Defaults sind 200000 Operationen, 4096 Darstellungszustände, 10000 erzeugte Instanzen pro Gruppe, 32 MiB Eingabe- und Dokumentumschlag, 65536 Skript-Bytes, 32 konditionale Verschachtelungsebenen und 5000 Millisekunden

MaxInputBytes begrenzt auch einen konservativen escaped-XML-Umschlag vor jedem Layout- und Veröffentlichungsdurchlauf, einschließlich Identitätsattribute, Namespace-Deklarationen, Text und datasets-Änderungen; gültiges XML kann diese konservative Grenze erreichen, bevor seine serialisierte Bytezahl denselben Wert erreicht

Cancelled ist ein optionaler Objektmethode-Callback, der während der begrenzten Arbeit geprüft wird; die Optionen der eingebetteten Runtime begrenzen weiterhin Widgets, Werte, Berechnungen, Layout, Reflow und native Skriptarbeit

Host-Painting und Accessibility

Accessibility liefert sichtbare Widget-Records mit stabiler ID, Rolle, Beschriftung oder Feldname, Tooltip-Beschreibung, committetem Wert, Seite und Grenzen, Fokus, Gültigkeit, Read-only- und Required-Zuständen sowie Choice-Labels; Passwortwerte werden weggelassen

PaintPage liefert einen Snapshot sichtbarer Widgets und passender Accessibility-Records an einen TXFAHostWidgetPainter; eigene Hosts können ihre eigenen Controls oder Rendering-Oberflächen implementieren

TXFACanvasWidgetPainter bietet echtes VCL- und LCL-Canvas-Painting für Widgetrahmen, Text, Passwortmaskierung, Checkbox- und Radio-Markierungen, Choice-Indikatoren, Buttons und Fokus, mit positivem Scale und optionalen Offsets; er clippt jedes Widget und stellt Canvas-Stile wieder her

Der Canvas-Adapter zeichnet Widgets und nicht den vollständigen statischen XFA-Grafikbaum; der Host liefert seinen eigenen Seitenhintergrund, statische Grafiken, Event-Routing, Auswahl-Darstellung und Accessibility-Bridge zu seiner Plattform

Runtime und Helfer sind Single-Thread-Objekte; Callbacks müssen der Thread-Besitzverteilung des Hosts folgen und rekursive Mutationen während einer aktiven Transaktion vermeiden

C++Builder-Aufrufer müssen alle Konstruktorargumente des Canvas-Painters angeben, etwa new TXFACanvasWidgetPainter(canvas, 1, 0, 0); die erzeugten Header behalten diese Fließkomma-Defaultargumente nicht

Verifikation

Die Abnahme deckt 106 Delphi-Fälle je Architektur ab, frische FPC-Kompilierung auf beiden Windows-Architekturen, C++Builder-Kompilierung der öffentlichen Header auf Win32 und Win64x sowie unabhängige Validierung der tatsächlichen PDF/XDP-Ausgabe

Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp enthält unabhängige Datennamen, drei wiederholte Rechnungszeilen, ein konditionales Event, Metadaten für Accessibility und eine folgende Fußzeile

Run-XFAInstancePresentationTests.ps1 führt die Helferprüfungen und vorhandene XFA-Event-, Runtime-, Scripting-, SOM-, DOM- und Auflösungs-Regressionsfixtures ohne GUI oder externe PDF-Reader aus

Das unabhängige verify_saved_invoice.py liest die erzeugte PDF mit pypdf und prüft echte XDP-Datenzeilen, eindeutige persistente Identitäten, verborgene Vorkommenszustände, initialisierte Defaults und Neulade-Identitäten

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

Siehe Interactive XFA Widget Runtime für die kompatible Basis-Runtime und den nativen Editing-Vertrag