Aller au contenu
getnextpdf.com

Pro édition

Formulaires — Référence détaillée

Cette page est la référence détaillée du module Form de Pro. Elle couvre l’extraction des valeurs AcroForm, la lecture et l’écriture XFDF, la liaison de données et l’extraction des données XFA. Le module consomme les valeurs NextPDF\Form\FormField produites par le lecteur de formulaires de Core et leur ajoute la sérialisation, l’analyse et la liaison. La prise en charge de XFA est orientée données : l’analyseur structure les paquets template et datasets. Il n’exécute pas les scripts de calcul XFA et ne restitue pas les mises en page XFA dynamiques.

Cette fonctionnalité est fournie dans NextPDF Pro (nextpdf/pro) et s’active avec une enveloppe de licence de niveau Pro. Un déploiement dépourvu de ce droit ne charge pas les classes de la fonctionnalité. Compare les éditions et obtiens une licence.

Il n’existe aucun indicateur de licence par fonctionnalité. Il s’agit d’une fonctionnalité de l’édition Pro.

SymboleParamètresComportement par défautRenvoieLève ou échoue avecNotes
FormDataExtractor::extractlist<FormField> $fieldsLit le nom et la valeur de chaque champXfdfDataInclut les champs dont la valeur est vide.
FormDataExtractor::toArraylist<FormField> $fieldsConstruit une table de correspondance nom-valeur de chaînesarray<string, string>Un nom en double ultérieur écrase le précédent.
FormDataExtractor::toXfdflist<FormField> $fields, ?string $pdfHref = nullDélègue à XfdfWriter::fromFieldsstring (XML XFDF)Chemin de commodité pour un export en un seul appel.
FormDataExtractor::extractNonEmptylist<FormField> $fieldsIgnore les champs dont la valeur est la chaîne videXfdfData
FormDataExtractor::getEmptyFieldNameslist<FormField> $fieldsListe les noms des champs sans valeur définielist<string>Complément de extractNonEmpty.
XfdfWriter::fromFieldslist<FormField> $fields, ?string $pdfHref = nullCollecte les paires nom-valeur, délègue à fromArraystring (XML XFDF)
XfdfWriter::fromArrayarray<string, string> $data, ?string $pdfHref = nullEncapsule la table dans XfdfData, délèguestring (XML XFDF)
XfdfWriter::fromXfdfDataXfdfData $data, ?string $pdfHref = nullSérialise en XFDF ; les noms en notation pointée s’imbriquent en éléments <field> hiérarchiquesstring (XML XFDF)Supprime les caractères de contrôle interdits par XML 1.0 ; voir le contrat de comportement.
XfdfParser::parsestring $xfdfXmlCharge le XML de façon sûre contre les XXE et aplatit les champs en notation pointéeXfdfDataInvalidArgumentExceptionPlafond d’entrée de 10 MiB ; accepte les racines avec ou sans espace de noms.
XfdfParser::parseFilestring $filePathRésout le chemin, lit le fichier, délègue à parseXfdfDataInvalidArgumentExceptionLes chemins manquants, non-fichiers ou illisibles lèvent une exception.
XfaParser::parsestring $pdfDataVérification du marqueur, extraction du XML, analyse des paquetsXfaFormDataInvalidArgumentException, XfaParseExceptionL’absence du marqueur /XFA renvoie un résultat vide, pas une erreur.
XfaParser::hasXfastring $pdfDataParcourt les octets à la recherche du marqueur /XFAboolBalayage de marqueur d’octets ; toute occurrence du jeton correspond.
XfaParser::extractXfaXmlstring $pdfDataBalayage des flux à la recherche de marqueurs XFA, puis recherche directe de <xdp:xdp>string (XML XFA ou '')RuntimeException (déclarée)Balaie au plus les 50 premiers MiB de l’entrée.
XfaParser::parseXmlstring $xmlExtrait les paquets template et datasets, analyse les éléments <field>XfaFormDataXfaParseExceptionPlafond XML de 10 MiB, appliqué avant le chargement du DOM.
FormDataBinder::bindlist<FormField> $fields, XfdfData $dataCrée de nouvelles instances FormField avec les valeurs liéesFormDataBindResultLes originaux ne sont jamais modifiés ; les cases à cocher se normalisent en Yes/Off.
FormDataBinder::fromXfdflist<FormField> $fields, string $xfdfXmlAnalyse le XFDF, puis lieFormDataBindResultInvalidArgumentExceptionLes modes d’échec sont ceux de XfdfParser::parse.
FormDataBinder::fromArraylist<FormField> $fields, array<string, string> $dataEncapsule la table dans XfdfData, puis lieFormDataBindResult
FormDataBindResultisFullyBound, hasNoUnmatchedKeys, boundCount, fieldCount; readonly fields, boundFieldNames, unmatchedDataKeys, unboundFieldNamesDiagnostics de liaison immuablesselon la méthodeisFullyBound exige zéro clé non appariée et zéro champ non lié.
XfdfDatahasField, getValue, count, isEmpty, getFieldNames, withField, withoutField, merge; readonly fieldsConteneur nom-valeur immuableselon la méthodewith* et merge renvoient de nouvelles instances ; merge privilégie les valeurs de l’argument.
XfaFormDatagetField, hasField, count, fieldNames; readonly fields, templateXml, datasetsXmlRésultat d’analyse XFA immuableselon la méthodeTransporte le XML brut des paquets template et datasets pour l’aller-retour.
XfaFormFieldreadonly name, type, value, required, caption, optionsEnregistrement immuable d’un seul champtype vaut l’un de text, numeric, date, choice, button, signature.
XfaPacketcas d’énumération Template, Datasets, Config, LocaleSet, ConnectionSet, Form; xmlNamespace()Énumération de paquets adossée à des chaînesstring de xmlNamespace()Les URI d’espace de noms suivent la 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 étend RuntimeException — la charge utile XFA ne peut pas être analysée en un XfaFormData. Le sous-classement est délibéré : les sites d’appel catch (RuntimeException $e) existants continuent de fonctionner.
  • SPL InvalidArgumentException — entrée vide, surdimensionnée, malformée ou non-XFDF vers XfdfParser ; entrée PDF vide vers XfaParser::parse ; chemins illisibles dans XfdfParser::parseFile.

Extraction AcroForm. FormDataExtractor parcourt la liste de champs que tu lui passes et lit le nom et la valeur de chaque champ. extract renvoie un XfdfData ; toArray renvoie une simple table de correspondance nom-valeur de chaînes. extractNonEmpty écarte les champs dont la valeur est la chaîne vide ; getEmptyFieldNames renvoie la liste de noms complémentaire. L’extraction ne modifie jamais les champs d’entrée.

Écriture XFDF. XfdfWriter produit un document conforme à la structure ISO 19444-1:2019. La sortie commence par la déclaration XML XFDF et une racine xfdf dans l’espace de noms Adobe XFDF (http://ns.adobe.com/xfdf/) avec xml:space="preserve". Un pdfHref non nul émet une référence <f href="..."/> vers le PDF source. Les noms de champ en notation pointée (par exemple address.city) s’imbriquent dans une arborescence hiérarchique d’éléments <field>. Les valeurs et les attributs échappent les cinq métacaractères XML. Les noms de champ, les valeurs et le pdfHref sont en outre normalisés pour garantir la bonne formation : les caractères de contrôle C0 que XML 1.0 interdit sont supprimés, tandis que TAB, LF et CR sont préservés. Cette normalisation est à perte par conception, de sorte que l’écrivain émet toujours du XFDF bien formé et ré-analysable, quels que soient les octets fournis par l’appelant.

Lecture XFDF. XfdfParser accepte les racines xfdf avec ou sans espace de noms et compare le nom de la racine sans tenir compte de la casse, car certains producteurs émettent un élément racine en majuscules. Les arborescences hiérarchiques <field> s’aplatissent de nouveau en noms en notation pointée, de sorte que l’écriture et la lecture forment un aller-retour. Tout chargement de XML désactive l’accès réseau et la résolution d’entités externes. parseFile ajoute la résolution du chemin et des vérifications de lisibilité en amont de la même analyse.

Liaison de données. FormDataBinder::bind apparie les clés de données aux noms de champ. Comme FormField est immuable, la liaison crée de nouvelles instances avec des valeurs mises à jour ; les originaux ne sont jamais modifiés. Le résultat rapporte trois ensembles de diagnostics : les noms des champs liés, les clés de données sans champ correspondant et les champs n’ayant reçu aucune donnée. Les valeurs des cases à cocher se normalisent selon le modèle d’état activé/désactivé d’ISO 32000-2:2020, 12.7.5.2.3 : sans tenir compte de la casse, yes, true, 1 et on correspondent à Yes ; toute autre valeur correspond à Off.

Extraction des données XFA. XfaParser::parse accepte des octets PDF bruts. Il commence par rechercher le marqueur /XFA ; en son absence, il renvoie un XfaFormData vide. L’extraction essaie ensuite deux stratégies : un balayage des blocs streamendstream à la recherche d’indicateurs de XML XFA, puis une recherche directe d’un document <xdp:xdp>. Un fragment xdp:xdp unique est renvoyé tel quel ; plusieurs fragments sont concaténés dans une enveloppe xdp:xdp synthétisée. parseXml extrait les paquets template et datasets et analyse chaque élément <field> du template en un XfaFormField : l’attribut name est requis, le type dérive de l’élément enfant UI du champ, l’indicateur required dérive d’un élément validate dont nullTest vaut error, et les options de choix proviennent des enfants items.

La prise en charge de XFA est orientée données. L’analyseur structure les paquets template et datasets. Il n’exécute pas les scripts de calcul XFA, ne restitue pas les mises en page XFA dynamiques et ne réalise pas l’aller-retour de tous les types de paquets. Valide l’analyseur sur ton propre ensemble de documents avant de t’y fier.

  • XfdfParser::parse('') lève InvalidArgumentException. Une entrée supérieure à 10 MiB lève InvalidArgumentException en nommant le plafond.
  • Un XML malformé lève InvalidArgumentException porteuse des messages libxml collectés. Un document bien formé dont la racine n’est pas xfdf lève une exception et nomme l’élément racine réel.
  • Un document XFDF sans élément <fields> s’analyse en un XfdfData vide ; ce n’est pas une erreur.
  • Les éléments de champ sans attribut name sont ignorés dans l’analyse XFDF comme XFA. Un champ XFDF sans enfant <value> ne contribue aucune entrée.
  • XfaParser::parse('') lève InvalidArgumentException. Un PDF dépourvu du marqueur /XFA, ou dont le XML XFA est introuvable, renvoie un XfaFormData vide au lieu de lever une exception.
  • hasXfa est un balayage de marqueur d’octets : tout jeton /XFA dans le fichier correspond, y compris un jeton dans un objet inutilisé. L’étape d’extraction suivante décide s’il existe un XML exploitable.
  • L’extraction XFA examine au plus les 50 premiers MiB de la chaîne d’octets du PDF ; le contenu au-delà de cette limite n’est pas balayé.
  • Un XML XFA supérieur à 10 MiB lève XfaParseException avant qu’aucune arborescence DOM ne soit matérialisée. Un XML XFA malformé lève XfaParseException avec les messages libxml.
  • La normalisation des cases à cocher ne laisse jamais passer de valeurs non reconnues ; tout ce qui sort des formes « activé » acceptées correspond à Off.
  • La suppression des caractères de contrôle par l’écrivain est à perte : les octets C0 interdits par XML 1.0 dans les noms, les valeurs ou le pdfHref sont supprimés afin que la sortie reste bien formée. TAB, LF et CR survivent.
  • Toute analyse XML désactive la résolution d’entités externes et l’accès réseau (sûr contre les XXE).
  • Ce module n’effectue aucune opération cryptographique ; le mode FIPS ne change pas son comportement.
ComportementRéférenceStatut
Modèle de formulaire interactif / dictionnaire de champISO 32000-2:2020, 12.7Aligné (fondé sur le produit)
Normalisation de l’état activé/désactivé des cases à cocher (Yes/Off)ISO 32000-2:2020, 12.7.5.2.3Aligné ; clause citée dans le registre de citations de cette page
Structure d’échange de données XFDFISO 19444-1:2019Aligné (fondé sur le produit)
Noms de paquets XFA et URI d’espace de nomsXFA Specification 3.3Aligné (fondé sur le produit)

Le corpus RAG disponible au moment de la rédaction n’inclut pas ISO 19444-1:2019, la XFA Specification ni W3C XML 1.0, de sorte que ces déclarations d’alignement sont fondées sur le produit à partir des annotations de source et des tests plutôt que citées par clause. Ces déclarations décrivent la capacité au regard des documents référencés. NextPDF ne détient aucune certification de conformité, et la prise en charge d’une clause n’est pas une revendication de certification.

  • Chaque point d’entrée sauf XfaParser est statique. XfaParser est instanciable et sans état ; une même instance peut être réutilisée sans risque sur plusieurs documents.
  • L’aller-retour prévu est le suivant : le lecteur de formulaires de Core produit des valeurs FormField ; FormDataExtractor ou XfdfWriter les sérialise ; XfdfParser relit les données ; FormDataBinder les applique à une liste de champs. Les noms hiérarchiques survivent à l’aller-retour grâce à la notation pointée.
  • Utilise les diagnostics FormDataBindResult (isFullyBound, unmatchedDataKeys, unboundFieldNames) pour détecter un écart entre un fichier de données XFDF et un modèle PDF révisé avant d’accepter un remplissage.
  • XfdfData est un objet-valeur : withField, withoutField et merge renvoient de nouvelles instances. En cas de collision de clés, merge privilégie les valeurs de l’argument.
  • XfaFormData conserve le XML brut des paquets template et datasets (templateXml, datasetsXml) afin que tu puisses post-traiter les paquets que le modèle de champ ne couvre pas.
  • Ce module n’analyse pas lui-même les dictionnaires AcroForm à partir des octets PDF ; il consomme les champs produits par le lecteur de formulaires de Core. Seul XfaParser opère sur du contenu PDF brut.

Cette page documente uniquement le comportement observable de l’extérieur et la surface d’API publique prise en charge. Les chemins d’espaces de noms internes, les classes utilitaires, les tables de mécanismes, les noms de fichiers de runbook et les préfixes de tickets sont hors périmètre.