Prise en charge AcroForm

Vue d’ensemble

Depuis HotPDF v2.5.0, la bibliothèque peut émettre des formulaires interactifs (AcroForm) conformément à la section 12.7 de PDF 1.7 ISO 32000-1. Chaque champ de formulaire est créé sous forme d’annotation Widget fusionnée avec le dictionnaire du champ et est enregistré automatiquement avec le document, de sorte que l’entrée globale /AcroForm soit ajoutée au Catalog lorsque le document est finalisé dans EndDoc

Types de champs pris en charge

  • Champs de texte (/FT /Tx) via THPDFPage.AddTextField. Prend en charge les options ligne unique, multi-ligne, mot de passe, comb, sélection de fichier, texte enrichi, défilement et vérification orthographique via THPDFFormFieldFlags
  • Cases à cocher (/FT /Btn, sans bits Pushbutton/Radio) via THPDFPage.AddCheckBox avec un nom de valeur d’export configurable et un état initial coché
  • Boutons radio (/FT /Btn /Ff Radio) via THPDFPage.AddRadioButton. Plusieurs appels avec le même nom de groupe sont fusionnés sous un champ parent partagé avec un tableau /Kids, exactement comme l’exige 12.7.4.2
  • Zones de liste déroulante (/FT /Ch /Ff Combo) via THPDFPage.AddComboBox. Passez un tableau ouvert d’options
  • Zones de liste (/FT /Ch) via THPDFPage.AddListBox. ffMultiSelect active la sélection multiple
  • Boutons poussoirs (/FT /Btn /Ff Pushbutton) via THPDFPage.AddPushButton avec légende facultative (/MK /CA). Depuis HotPDF v2.31.0, THPDFPage.AddPushButtonWithAction attache un dictionnaire d’action PDF au widget afin qu’un clic sur le bouton exécute /SubmitForm (envoie les valeurs des champs vers une URL, PDF 1.2 12.7.5.2), /ResetForm (PDF 1.2 12.7.5.3), /JavaScript (exécute un extrait JS, PDF 1.3 12.6.4.16) ou /URI (ouvre une URL dans le navigateur système, PDF 1.1 12.6.4.7)
  • Champs d’espace réservé pour signature (/FT /Sig) via THPDFPage.AddSignatureField depuis HotPDF v2.12.0. Le dictionnaire AcroForm gagne automatiquement /SigFlags 3 (SignaturesExist + AppendOnly) lorsqu’au moins un champ de signature est présent. Le champ est laissé non signé afin que des outils externes (Adobe Acrobat, Foxit, bibliothèques de signature CMS / PKCS#7 dédiées) puissent joindre la signature cryptographique réelle après l’enregistrement du fichier
  • Flux de signature en place via THPDFPage.AddSignedSignatureField + THotPDF.PreparePDFForSigning + THotPDF.InsertSignatureHex depuis HotPDF v2.23.0. Le premier appel réserve un dictionnaire de signature /V avec des espaces réservés /ByteRange et /Sommaire. Après l’enregistrement du document, l’application hôte appelle PreparePDFForSigning pour ajuster /ByteRange et savoir quelles plages du fichier doivent être hachées. Après la production externe d’une signature détachée CMS / PKCS#7 (Windows CryptoAPI, OpenSSL, bibliothèques de signature dédiées), elle appelle InsertSignatureHex pour déposer l’hexadécimal de la signature dans l’espace réservé sans perturber aucun autre octet du fichier

Inspection et mise à jour des champs de formulaire chargés

Depuis HotPDF v2.121.9, les applications peuvent charger un PDF AcroForm existant avec THotPDF.LoadFromFile, énumérer ses champs, lire leurs noms, types et valeurs, modifier les valeurs des champs, basculer l’indicateur read-only et enregistrer le graphe d’objets chargé avec THotPDF.SaveLoadedDocument Ce chemin est prévu pour des modifications persistantes sur un document déjà chargé; n’appelez pas BeginDoc / EndDoc simplement pour sauvegarder des changements de valeurs de champ

Les assistants de champ sont GetFormFieldCount, GetFormFieldName, GetFormFieldType, GetFormFieldValue, SetFormFieldValue et SetFormFieldReadOnly La recherche de champ accepte soit un indice de champ à base zéro, soit le nom qualifié complet du champ. Les valeurs retournées par THPDFLoadedFormFieldType sont lfftText, lfftButton, lfftChoice, lfftSignature ou lfftUnknown

Exemple Pascal sur champs chargés

HPDF.LoadFromFile('InputForm.pdf');
for I := 0 to HPDF.GetFormFieldCount - 1 do
  Writeln(HPDF.GetFormFieldName(I), ' = ', HPDF.GetFormFieldValue(I));

HPDF.SetFormFieldValue('CustomerName', 'Bob');
HPDF.SetFormFieldValue('Plan', 'Premium');
HPDF.SetFormFieldReadOnly('CustomerName', True);
HPDF.SaveLoadedDocument('UpdatedForm.pdf');

Actions supplémentaires de champ

AttachFieldKeyStrokeAction, AttachFieldFormatAction, AttachFieldValidateAction et AttachFieldCalculateAction attachent du JavaScript au dictionnaire /AA d’un champ pour les déclencheurs PDF /K, /F, /V et /C. Utilisez-les après la création ou le chargement du champ lorsque filtrage, formatage, validation ou calcul doivent appartenir au champ

Génération des apparences

Par défaut, le dictionnaire /AcroForm émis définit /NeedAppearances true et délègue le rendu des flux d’apparence au lecteur consommateur (Adobe Reader, Foxit, Chrome, navigateurs, Apple Preview) Définissez THotPDF.AutoFormAppearances à true avant d’ajouter des champs et HotPDF préconstruit des Form XObjects /AP /N (PDF 1.7 8.10) pour chaque champ texte, bouton poussoir, choix (combo / liste) ainsi que les états Yes / Off de chaque case à cocher / bouton radio enfant. Le dictionnaire AcroForm porte alors /NeedAppearances false et une entrée de ressources par défaut /DR référençant les 14 polices de base standard (Helv Helvetica, ZaDb ZapfDingbats), afin que les moteurs de rendu qui ignorent /NeedAppearances affichent quand même le contenu des champs correctement. Disponible depuis HotPDF v2.28.0

Référence des indicateurs de champ (THPDFFormFieldFlags)

  • ffReadOnly, ffRequired, ffNoExport — indicateurs communs du Table 227 applicables à tous les types de champ
  • ffMultiline, ffPassword, ffFileSelect, ffDoNotSpellCheck, ffDoNotScroll, ffComb, ffRichText — spécifiques à Tx (Table 228)
  • ffEdit, ffSort, ffMultiSelect, ffDoNotSpellCheck, ffCommitOnSelChange — spécifiques à Ch (Table 230)

Exemple Pascal

HPDF.BeginDoc;
HPDF.AddPage;
HPDF.CurrentPage.AddTextField('Name', '', Rect(50, 100, 250, 120));
HPDF.CurrentPage.AddCheckBox('Agree', 'Yes', Rect(50, 130, 70, 145), True);
HPDF.CurrentPage.AddRadioButton('Color', 'Red',   Rect(50, 160, 70, 175), True);
HPDF.CurrentPage.AddRadioButton('Color', 'Green', Rect(80, 160, 100, 175));
HPDF.CurrentPage.AddRadioButton('Color', 'Blue',  Rect(110, 160, 130, 175));
HPDF.CurrentPage.AddComboBox('Country', 'CN',
                             ['CN', 'US', 'JP'], Rect(50, 190, 250, 210));
HPDF.EndDoc;

Limitations

  • Le générateur AutoFormAppearances ne compose actuellement que des valeurs ASCII / WinAnsi-encodables; pour les champs dont /V contient du texte multioctet (UTF-8), le /AP stocké affiche un rectangle vide jusqu’à ce que le lecteur hôte régénère l’apparence
  • Les sous-états Down (/D) et rollover (/R) ne sont pas générés; seul l’état normal (/N) est produit
  • L’unicité des noms de champ relève de l’appelant; HotPDF ne l’impose pas

Voir aussi