|
Registriert ein benanntes XFA (XML Forms Architecture)-Paket für die Ausgabe innerhalb des AcroForm-Eintrags /XFA des Dokuments — PDF 1.7 §12.7.6 + §12.7.8 ermöglicht es einem AcroForm, ein /XFA-Array neben (oder anstelle) des statischen Arrays /Fields zu tragen, was hybride AcroForm + XFA-Workflows oder reine dynamische XFA-Formulare ermöglicht
Delphi-Syntax:
procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);
procedure ClearXFAPackets;
function XFAPacketCount: Integer;
Beschreibung
Jeder Aufruf von AddXFAPacket registriert ein benanntes Paket — Typische Namen (gemäß der XFA 3.3-Spezifikation und PDF 1.7 §12.7.8 Tabelle 234):
template — Formularlayout + Skripte (das größte Paket in den meisten XFA-Dokumenten)
datasets — Datenbindung (die XML-Nutzlast, gegen die das Template gerendert wird)
config — Viewer-Konfiguration
connectionSet — Externe Datenverbindungen
localeSet — Gebietsschemaspezifische Formatierungsregeln
stylesheet — XSLT- oder CSS-Styling
xfdf — XFDF-Formulardaten-Overlay
xmpmeta — XMP-Metadaten
signature — Signaturbezogene XFA-Daten
sourceSet — Quellseitige Datendefinitionen
Bei EndDoc wird jedes registrierte Paket zu einem indirekten, mit FlateDecode komprimierten Stream-Objekt, und das AcroForm-Array /XFA wechselt in der Registrierungsreihenfolge zwischen Paketnamen-PDF-Strings und Stream-Referenzen ab, sodass das Layout byte-deterministisch ist — ClearXFAPackets entfernt alle registrierten Pakete (nützlich für die Wiederverwendung einer THotPDF-Instanz über mehrere Dokumente hinweg); XFAPacketCount gibt die aktuelle Anzahl zurück
Nur Unterstützung auf Container-Ebene
HotPDF analysiert das XFA-XML nicht, implementiert nicht die dynamische XFA-Layout-Engine, führt kein FormCalc oder JavaScript innerhalb des XFA-Templates aus und validiert die Template-Struktur nicht — Der Aufrufer erstellt das XFA-XML selbst (normalerweise über den Adobe LiveCycle Designer oder manuell gemäß der XFA 3.3-Spezifikation) und HotPDF gibt die Bytes unverändert aus
Consumer-Reader mit einer XFA-Engine (ältere Versionen von Acrobat / Reader, FormsCentral, einige Kiosk-Produkte) rendern das Formular; Reader ohne eine XFA-Engine (Adobe Reader DC ab 2017, die meisten Open-Source-Reader) zeigen die Fallback-AcroForm-Felder an, wenn es sich bei dem Dokument um einen hybriden AcroForm + XFA-Workflow handelt
PDF/A- und PDF/X-Konformitätsschranken
ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 verbieten alle explizit XFA-Formulare (die dynamische Layout-Engine ist nicht deterministisch archivierbar) — ISO-15930-Druckvorstufen-Workflows lehnen interaktive Formulare vollständig ab; AddXFAPacket löst unter jeder nicht leeren PDFACompliance oder PDFXCompliance sofort einen Fehler mit dem entsprechenden Spezifikationsverweis aus; doppelte Paketnamen lösen einen Fehler aus; leere PacketName oder leere XMLBytes lösen einen Fehler aus; RequirePDFVersion(pdf15) erhöht die Dokumentversion automatisch
Ausgabe des AcroForm-Dictionarys
Das AcroForm-Dict wird ausgegeben, wenn entweder /Fields mindestens einen Eintrag enthält oder mindestens ein XFA-Paket registriert wurde — Aufrufer vor v2.119.51, die keine Pakete registrieren, behalten eine byte-identische /AcroForm-Ausgabe bei
Typischer Arbeitsablauf (reines dynamisches XFA-Formular)
PDF.BeginDoc;
TemplateBytes := TFile.ReadAllBytes('form-template.xml');
DataBytes := TFile.ReadAllBytes('form-data.xml');
PDF.AddXFAPacket('xdp:xdp', BytesOf('<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">'));
PDF.AddXFAPacket('template', TemplateBytes);
PDF.AddXFAPacket('datasets', DataBytes);
PDF.AddXFASignaturePacket(SigBytes); { vom Aufrufer generiertes XAdES }
PDF.AddXFAPacket('/xdp:xdp', BytesOf('</xdp:xdp>'));
PDF.EndDoc;
XDP-Wrapper, Single-Stream, dynamisches und signiertes XFA
Die Array-Form von /XFA muss mit xdp:xdp-Wrapper-Paketen geöffnet und geschlossen werden, wie das Beispiel nun zeigt (ISO 32000-1 §12.7.8) — Verwandte XFA-APIs: SetXFADocument schreibt das gesamte XFA/XDP-Dokument as einen einzelnen /XFA-Stream, was sich gegenseitig mit AddXFAPacket ausschließt; XFANeedsRendering setzt das Flag Catalog /NeedsRendering (ISO 32000-1 §7.7.2), sodass ein Viewer ein dynamisches XFA-Formular beim ersten Öffnen neu generiert; AddXFASignaturePacket bettet eine vom Aufrufer generierte XAdES- / XML-DSig-Signatur als signature-Paket ein; HotPDF generiert oder analysiert die Signatur niemals — der Aufrufer erzeugt sie mit einer XML-Kryptografiebibliothek über die XFA-Datasets
XFA-zu-AcroForm-Flattening
ApplyXFAAsAcroForm bildet vom Aufrufer bereitgestellte XDP/XFA-Bytes als native AcroForm-Widgets und einfache Seitengrafiken auf der aktuellen Seite ab — FlattenLoadedXFA führt dieselbe Konvertierung für ein geladenes PDF durch, das bereits ein eingebettetes /XFA-Paket enthält; übergeben Sie Editable=False, um generierte Widgets schreibgeschützt zu machen, und überprüfen Sie XFAFlattenWarnings auf Elemente, die nicht abgebildet werden konnten
Siehe auch: AcroForm-Unterstützung, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField
|