THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

THotPDF XFA-Formularcontainer (v2.119.51)

 

RegisterAcroFormFont  AcroForm-Unterstützung

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