Zum Inhalt springen
getnextpdf.com

Pro Edition

Form — Detailreferenz

Diese Seite ist die Detailreferenz für das Pro-Modul Form. Sie behandelt die Extraktion von AcroForm-Werten, das Lesen und Schreiben von XFDF, die Datenbindung sowie die Extraktion von XFA-Daten. Das Modul verarbeitet NextPDF\Form\FormField-Werte, die vom Core-Formularleser erzeugt werden, und ergänzt darauf aufbauend Serialisierung, Parsing und Bindung. Die XFA-Unterstützung ist datenorientiert: Der Parser strukturiert die Template- und Datasets-Pakete. Er führt keine XFA-Berechnungsskripte aus und rendert keine dynamischen XFA-Layouts.

Diese Funktion ist in NextPDF Pro (nextpdf/pro) enthalten und wird mit einem Lizenz-Envelope der Pro-Stufe aktiviert. Eine Bereitstellung ohne diese Berechtigung lädt die Klassen der Funktion nicht. Editionen vergleichen und eine Lizenz erwerben.

Es gibt kein funktionsspezifisches Lizenz-Flag. Dies ist eine Funktion der Pro-Edition.

SymbolParameterStandardverhaltenRückgabeWirft oder scheitert mitHinweise
FormDataExtractor::extractlist<FormField> $fieldsLiest Name und Wert jedes FeldsXfdfDataSchließt Felder mit leerem Wert ein.
FormDataExtractor::toArraylist<FormField> $fieldsErstellt eine Name-zu-Wert-String-Zuordnungarray<string, string>Ein späterer doppelter Name überschreibt einen früheren.
FormDataExtractor::toXfdflist<FormField> $fields, ?string $pdfHref = nullDelegiert an XfdfWriter::fromFieldsstring (XFDF-XML)Komfortpfad für den Export in einem einzigen Aufruf.
FormDataExtractor::extractNonEmptylist<FormField> $fieldsÜberspringt Felder, deren Wert die leere Zeichenkette istXfdfData
FormDataExtractor::getEmptyFieldNameslist<FormField> $fieldsListet Namen von Feldern ohne gesetzten Wert auflist<string>Komplement zu extractNonEmpty.
XfdfWriter::fromFieldslist<FormField> $fields, ?string $pdfHref = nullSammelt Name-zu-Wert-Paare, delegiert an fromArraystring (XFDF-XML)
XfdfWriter::fromArrayarray<string, string> $data, ?string $pdfHref = nullKapselt die Zuordnung in XfdfData, delegiertstring (XFDF-XML)
XfdfWriter::fromXfdfDataXfdfData $data, ?string $pdfHref = nullSerialisiert zu XFDF; Namen in Punktnotation werden als hierarchische <field>-Elemente verschachteltstring (XFDF-XML)Entfernt in XML 1.0 unzulässige Steuerzeichen; siehe den Verhaltensvertrag.
XfdfParser::parsestring $xfdfXmlLädt das XML XXE-sicher und flacht Felder in Punktnotation abXfdfDataInvalidArgumentExceptionEingabeobergrenze 10 MiB; akzeptiert Roots mit und ohne Namespace.
XfdfParser::parseFilestring $filePathLöst den Pfad auf, liest die Datei, delegiert an parseXfdfDataInvalidArgumentExceptionFehlende, nicht als Datei vorliegende oder nicht lesbare Pfade lösen aus.
XfaParser::parsestring $pdfDataMarkerprüfung, XML-Extraktion, Paket-ParsingXfaFormDataInvalidArgumentException, XfaParseExceptionOhne /XFA-Marker wird ein leeres Ergebnis zurückgegeben, kein Fehler.
XfaParser::hasXfastring $pdfDataDurchsucht die Bytes nach dem /XFA-MarkerboolByte-Marker-Scan; jedes Vorkommen des Tokens trifft zu.
XfaParser::extractXfaXmlstring $pdfDataStream-Scan nach XFA-Markern, dann direkte <xdp:xdp>-Suchestring (XFA-XML oder '')RuntimeException (deklariert)Scannt höchstens die ersten 50 MiB der Eingabe.
XfaParser::parseXmlstring $xmlExtrahiert Template- und Datasets-Pakete, parst <field>-ElementeXfaFormDataXfaParseExceptionXML-Obergrenze 10 MiB, vor dem DOM-Laden erzwungen.
FormDataBinder::bindlist<FormField> $fields, XfdfData $dataErstellt neue FormField-Instanzen mit gebundenen WertenFormDataBindResultOriginale werden nie verändert; Kontrollkästchen normalisieren auf Yes/Off.
FormDataBinder::fromXfdflist<FormField> $fields, string $xfdfXmlParst das XFDF, bindet dannFormDataBindResultInvalidArgumentExceptionDie Fehlermodi entsprechen denen von XfdfParser::parse.
FormDataBinder::fromArraylist<FormField> $fields, array<string, string> $dataKapselt die Zuordnung in XfdfData, bindet dannFormDataBindResult
FormDataBindResultisFullyBound, hasNoUnmatchedKeys, boundCount, fieldCount; readonly fields, boundFieldNames, unmatchedDataKeys, unboundFieldNamesUnveränderliche Bindungsdiagnostikpro MethodeisFullyBound erfordert null nicht zugeordnete Schlüssel und null ungebundene Felder.
XfdfDatahasField, getValue, count, isEmpty, getFieldNames, withField, withoutField, merge; readonly fieldsUnveränderlicher Name-zu-Wert-Containerpro Methodewith* und merge geben neue Instanzen zurück; merge bevorzugt die Werte des Arguments.
XfaFormDatagetField, hasField, count, fieldNames; readonly fields, templateXml, datasetsXmlUnveränderliches XFA-Parse-Ergebnispro MethodeTrägt das rohe Template- und Datasets-Paket-XML für den Roundtrip.
XfaFormFieldreadonly name, type, value, required, caption, optionsUnveränderlicher Einzelfeld-Datensatztype ist eines von text, numeric, date, choice, button, signature.
XfaPacketEnum-Fälle Template, Datasets, Config, LocaleSet, ConnectionSet, Form; xmlNamespace()String-basierte Paket-Enumerationstring aus xmlNamespace()Namespace-URIs folgen der XFA Specification 3.3.
public static function extract(array $fields): XfdfData
public static function toArray(array $fields): array
public static function toXfdf(array $fields, ?string $pdfHref = null): string
public static function extractNonEmpty(array $fields): XfdfData
public static function getEmptyFieldNames(array $fields): array
public static function fromFields(array $fields, ?string $pdfHref = null): string
public static function fromArray(array $data, ?string $pdfHref = null): string
public static function fromXfdfData(XfdfData $data, ?string $pdfHref = null): string
public static function parse(string $xfdfXml): XfdfData
public static function parseFile(string $filePath): XfdfData
public function parse(string $pdfData): XfaFormData
public function hasXfa(string $pdfData): bool
public function extractXfaXml(string $pdfData): string
public function parseXml(string $xml): XfaFormData
public static function bind(array $fields, XfdfData $data): FormDataBindResult
public static function fromXfdf(array $fields, string $xfdfXml): FormDataBindResult
public static function fromArray(array $fields, array $data): FormDataBindResult
  • NextPDF\Pro\Form\Exception\XfaParseException erweitert RuntimeException — die XFA-Nutzlast kann nicht in ein XfaFormData geparst werden. Die Ableitung ist bewusst gewählt: Bestehende catch (RuntimeException $e)-Aufrufstellen funktionieren weiterhin.
  • SPL InvalidArgumentException — leere, überdimensionierte, fehlerhafte oder nicht als XFDF vorliegende Eingabe an XfdfParser; leere PDF-Eingabe an XfaParser::parse; nicht lesbare Pfade in XfdfParser::parseFile.

AcroForm-Extraktion. FormDataExtractor durchläuft die von Ihnen übergebene Feldliste und liest Name und Wert jedes Felds. extract gibt ein XfdfData zurück; toArray gibt eine einfache Name-zu-Wert-String-Zuordnung zurück. extractNonEmpty verwirft Felder, deren Wert die leere Zeichenkette ist; getEmptyFieldNames gibt die komplementäre Namensliste zurück. Die Extraktion verändert die Eingabefelder niemals.

XFDF-Schreiben. XfdfWriter erzeugt ein Dokument, das der Struktur von ISO 19444-1:2019 entspricht. Die Ausgabe beginnt mit der XFDF-XML-Deklaration und einem xfdf-Root im Adobe-XFDF-Namespace (http://ns.adobe.com/xfdf/) mit xml:space="preserve". Ein nicht-null pdfHref gibt eine <f href="..."/>-Referenz zurück auf die Quell-PDF aus. Feldnamen in Punktnotation (zum Beispiel address.city) werden in einen hierarchischen <field>-Elementbaum verschachtelt. Werte und Attribute maskieren die fünf XML-Metazeichen. Feldnamen, Werte und der pdfHref werden zusätzlich auf Wohlgeformtheit normalisiert: Die von XML 1.0 verbotenen C0-Steuerzeichen werden entfernt, während TAB, LF und CR erhalten bleiben. Diese Normalisierung ist bewusst verlustbehaftet, sodass der Writer unabhängig von den vom Aufrufer gelieferten Bytes stets wohlgeformtes, wieder-parsbares XFDF ausgibt.

XFDF-Lesen. XfdfParser akzeptiert sowohl xfdf-Roots mit als auch ohne Namespace und gleicht den Root-Namen ohne Beachtung der Groß-/Kleinschreibung ab, da einige Erzeuger ein Root-Element in Großbuchstaben ausgeben. Hierarchische <field>-Bäume werden wieder zu Namen in Punktnotation abgeflacht, sodass Schreiben und Lesen einen Roundtrip bilden. Jedes XML-Laden deaktiviert Netzwerkzugriff und die Auflösung externer Entitäten. parseFile stellt dem gleichen Parse-Vorgang eine Pfadauflösung und Lesbarkeitsprüfung voran.

Datenbindung. FormDataBinder::bind gleicht Datenschlüssel mit Feldnamen ab. Da FormField unveränderlich ist, erzeugt die Bindung neue Instanzen mit aktualisierten Werten; die Originale werden nie verändert. Das Ergebnis meldet drei Diagnosemengen: gebundene Feldnamen, Datenschlüssel ohne zugehöriges Feld und Felder, die keine Daten erhalten haben. Kontrollkästchenwerte normalisieren auf das Ein/Aus-Zustandsmodell von ISO 32000-2:2020, 12.7.5.2.3: yes, true, 1 und on (ohne Beachtung der Groß-/Kleinschreibung) werden auf Yes abgebildet; jeder andere Wert wird auf Off abgebildet.

XFA-Datenextraktion. XfaParser::parse akzeptiert rohe PDF-Bytes. Es sucht zunächst nach dem /XFA-Marker; ohne den Marker gibt es ein leeres XfaFormData zurück. Die Extraktion versucht dann zwei Strategien: einen Scan von streamendstream-Blöcken nach XFA-XML-Indikatoren, dann eine direkte Suche nach einem <xdp:xdp>-Dokument. Ein einzelnes xdp:xdp-Fragment wird unverändert zurückgegeben; mehrere Fragmente werden in einer synthetisierten xdp:xdp-Hülle zusammengefügt. parseXml extrahiert die Template- und Datasets-Pakete und parst jedes Template-<field>-Element in ein XfaFormField: Das Namensattribut ist erforderlich, der Typ leitet sich vom UI-Kindelement des Felds ab, das Erforderlich-Flag leitet sich von einem validate-Element mit nullTest auf error ab, und Auswahloptionen stammen aus items-Kindelementen.

Die XFA-Unterstützung ist datenorientiert. Der Parser strukturiert die Template- und Datasets-Pakete. Er führt keine XFA-Berechnungsskripte aus, rendert keine dynamischen XFA-Layouts und bildet nicht jeden Pakettyp im Roundtrip ab. Validieren Sie den Parser anhand Ihres spezifischen Dokumentsatzes, bevor Sie sich darauf verlassen.

  • XfdfParser::parse('') wirft InvalidArgumentException. Eine Eingabe über 10 MiB wirft InvalidArgumentException unter Nennung der Obergrenze.
  • Fehlerhaftes XML wirft InvalidArgumentException mit den gesammelten libxml-Meldungen. Ein wohlgeformtes Dokument, dessen Root nicht xfdf ist, wirft und nennt das tatsächliche Root-Element.
  • Ein XFDF-Dokument ohne <fields>-Element parst zu einem leeren XfdfData; das ist kein Fehler.
  • Feldelemente ohne name-Attribut werden sowohl beim XFDF- als auch beim XFA-Parsing übersprungen. Ein XFDF-Feld ohne <value>-Kindelement trägt keinen Eintrag bei.
  • XfaParser::parse('') wirft InvalidArgumentException. Eine PDF ohne den /XFA-Marker oder eine, deren XFA-XML nicht auffindbar ist, gibt ein leeres XfaFormData zurück, statt zu werfen.
  • hasXfa ist ein Byte-Marker-Scan: Jedes /XFA-Token in der Datei trifft zu, auch eines in einem ungenutzten Objekt. Der nachfolgende Extraktionsschritt entscheidet, ob brauchbares XML vorhanden ist.
  • Die XFA-Extraktion untersucht höchstens die ersten 50 MiB der PDF-Byte-Zeichenkette; Inhalt jenseits dieser Grenze wird nicht gescannt.
  • XFA-XML über 10 MiB wirft XfaParseException, bevor irgendein DOM-Baum materialisiert wird. Fehlerhaftes XFA-XML wirft XfaParseException mit den libxml-Meldungen.
  • Die Kontrollkästchen-Normalisierung reicht unerkannte Werte niemals durch; alles außerhalb der akzeptierten Ein-Formen wird auf Off abgebildet.
  • Das Entfernen von Steuerzeichen durch den Writer ist verlustbehaftet: In XML 1.0 unzulässige C0-Bytes in Namen, Werten oder dem pdfHref werden verworfen, damit die Ausgabe wohlgeformt bleibt. TAB, LF und CR bleiben erhalten.
  • Jedes XML-Parsing deaktiviert die Auflösung externer Entitäten und den Netzwerkzugriff (XXE-sicher).
  • Dieses Modul führt keine kryptografischen Operationen aus; der FIPS-Modus ändert sein Verhalten nicht.
VerhaltenReferenzStatus
Modell für interaktive Formulare / Feld-DictionariesISO 32000-2:2020, 12.7Konform (produktbasiert)
Kontrollkästchen-Ein/Aus-Zustandsnormalisierung (Yes/Off)ISO 32000-2:2020, 12.7.5.2.3Konform; Klausel im Zitationsdatensatz dieser Seite zitiert
XFDF-DatenaustauschstrukturISO 19444-1:2019Konform (produktbasiert)
XFA-Paketnamen und Namespace-URIsXFA Specification 3.3Konform (produktbasiert)

Das zum Zeitpunkt der Erstellung verfügbare RAG-Korpus enthält weder ISO 19444-1:2019 noch die XFA Specification oder W3C XML 1.0, sodass diese Konformitätsaussagen produktbasiert aus Quellannotationen und Tests abgeleitet und nicht klauselzitiert sind. Diese Aussagen beschreiben die Fähigkeit gegenüber den referenzierten Dokumenten. NextPDF hält keine Konformitätszertifizierung, und die Unterstützung einer Klausel ist keine Zertifizierungsaussage.

  • Jeder Einstiegspunkt außer XfaParser ist statisch. XfaParser ist instanziierbar und zustandslos; eine Instanz kann sicher über Dokumente hinweg wiederverwendet werden.
  • Der vorgesehene Roundtrip lautet: Der Core-Formularleser erzeugt FormField-Werte; FormDataExtractor oder XfdfWriter serialisiert sie; XfdfParser liest die Daten zurück; FormDataBinder wendet sie auf eine Feldliste an. Hierarchische Namen überstehen den Roundtrip über die Punktnotation.
  • Nutzen Sie die FormDataBindResult-Diagnostik (isFullyBound, unmatchedDataKeys, unboundFieldNames), um vor dem Akzeptieren einer Befüllung eine Abweichung zwischen einer XFDF-Datendatei und einem überarbeiteten PDF-Template zu erkennen.
  • XfdfData ist ein Wertobjekt: withField, withoutField und merge geben neue Instanzen zurück. Bei Schlüsselkollisionen bevorzugt merge die Werte des Arguments.
  • XfaFormData behält das rohe Template- und Datasets-Paket-XML (templateXml, datasetsXml), sodass Sie Pakete nachbearbeiten können, die das Feldmodell nicht abdeckt.
  • Dieses Modul parst AcroForm-Dictionaries nicht selbst aus PDF-Bytes; es verarbeitet vom Core-Formularleser erzeugte Felder. Nur XfaParser operiert auf rohem PDF-Inhalt.

Diese Seite dokumentiert ausschließlich extern beobachtbares Verhalten und die unterstützte öffentliche API-Oberfläche. Interne Namespace-Pfade, Hilfsklassen, Mechanismustabellen, Runbook-Dateinamen und Ticket-Präfixe sind nicht Teil des Umfangs.