Table of Contents

Zones de signature

Placer dans un PDF les zones qu'un signataire doit remplir : signature, initiales, date, champs de texte, cases à cocher, listes. Les zones s'utilisent avec la signature numérique.

Prérequis

Le flux de signature numérique : voir Signature numérique. Cette page détaille l'étape 2, le placement des zones.

Coordonnées

Point Règle
Unité Le point PDF (1/72 de pouce). Une page Letter mesure 612 x 792 points.
Origine Le coin supérieur gauche de la page ; y augmente vers le bas.
Position d'une zone x et y désignent le coin supérieur gauche de la zone.
Dimensions de la page GetPageDimensions donne la largeur et la hauteur d'une page, telle qu'elle s'affiche : une page pivotée de 90° a sa largeur et sa hauteur inversées.
Débordement Rien ne vérifie qu'une zone reste dans la page : contrôlez x + largeur et y + hauteur vous-même.

Exemple

SignZoneDetails[] zones;
using (var zoneBuilder = new ZoneBuilder(pdf, isPki: true))   // octets du PDF, ou son chemin
{
    var page = zoneBuilder.GetPageDimensions(1);
    float y = page.Height - 150;   // à 150 points du bas de la page

    zones = new[]
    {
        zoneBuilder.CreateFieldTextZone(page: 1, fieldName: "nom", x: 60, y: y - 40, width: 200, height: 20),
        zoneBuilder.CreateFieldSignZone(page: 1, fieldName: "signature", x: 60, y: y, width: 200, height: 50),
        zoneBuilder.CreateFieldDateSignZone(page: 1, fieldName: "date", x: 300, y: y + 15, width: 100, height: 20),
        zoneBuilder.CreateFieldCheckBoxZone(page: 1, fieldName: "accepte", x: 60, y: y + 70, required: true),
    };
}

Libérez toujours le ZoneBuilder après usage (using, with, close) : il garde le PDF ouvert.

Créer le ZoneBuilder

Élément .NET Python PHP
Source du PDF Ses octets ou son chemin Ses octets ou son chemin Son chemin, ou ses octets avec ZoneBuilder::fromBytes
Mode PKI isPki, true par défaut is_pki, true par défaut isPki, true par défaut
Nombre de pages Propriété PageCount Propriété page_count Méthode getPageCount()
Mode choisi Propriété IsPki, en lecture seule Attribut is_pki Non exposé

Le mode PKI ne fait qu'autoriser trois types de zones : le texte multiligne, la liste d'options et la liste déroulante. Il ne change rien aux autres zones. Il est actif par défaut : avec la signature numérique, laissez-le à true.

Types de zones

Toutes les méthodes prennent page (à partir de 1), fieldName, x et y. Toutes, sauf la case à cocher et le bouton radio, prennent aussi la largeur et la hauteur. La taille de police (fontSize) est en points, 12 par défaut.

Zone Méthode Paramètres propres (défaut) Points à retenir
Signature CreateFieldSignZone Aucun Toujours obligatoire.
Initiales CreateFieldInitialZone Aucun Toujours obligatoire.
Date de signature CreateFieldDateSignZone fontSize (12) Remplie automatiquement au moment de la signature. Toujours obligatoire.
Texte CreateFieldTextZone defaultValue (vide), fontSize (12), required (true)
Nombre CreateFieldNumberZone defaultValue (0 ; obligatoire en .NET), fontSize (12), required (true)
Date CreateFieldDateZone fontSize (12), required (true) Sélecteur de date.
Case à cocher CreateFieldCheckBoxZone isChecked (false), required (false), requiredFocus (false) Taille fixe (10 x 10). Une case obligatoire est toujours présentée décochée : isChecked est alors ignoré. Avec requiredFocus, le signataire doit passer par la case avant de compléter la signature ; required l'active aussi.
Bouton radio CreateFieldRadioZone groupId (obligatoire), isSelected (false) Taille fixe (10 x 10). Le nom du champ est la valeur de l'option ; les boutons d'un même groupe partagent le même groupId. Rien n'empêche de sélectionner plusieurs boutons d'un groupe : n'en sélectionnez qu'un.
Texte multiligne CreateFieldTextAreaZone defaultValue (vide), fontSize (12), required (false) Mode PKI seulement.
Liste d'options CreateFieldOptionListZone options (obligatoire), selectedValues (aucune), multiSelect (false), required (false) Mode PKI seulement. Sans multiSelect, une seule valeur peut être choisie d'avance. Pas de taille de police.
Liste déroulante CreateFieldDropdownZone options (obligatoire), selectedValue (aucune), fontSize (12), required (false) Mode PKI seulement.

Aucun SDK ne vérifie la taille ni la position d'une zone, sa taille de police, ni que les valeurs choisies d'avance figurent dans options.

Note

Valeur par défaut. Pour le texte, le texte multiligne et le nombre, la valeur par défaut est une valeur déjà remplie, que le signataire voit et peut modifier ; ce n'est pas un texte indicatif. Elle voyage avec la définition de la zone : n'y mettez que ce que le signataire doit voir.

En .NET, le champ nombre exige une valeur par défaut (defaultValue). En Python et en PHP, elle vaut 0.

Associer les zones aux signataires

Chaque signataire reçoit sa définition : son adresse, et pour le fichier (désigné par son empreinte SHA-512), ses zones en mode define. Voir l'étape 3 de l'exemple complet.

  • Plusieurs signataires : une définition par signataire, chacune avec ses propres zones.
  • Un fichier par signataire : une définition ne peut viser qu'un seul fichier.

Champs déjà présents dans le PDF

Avec DetectExistingFields (true par défaut), la certification détecte les champs déjà présents dans le PDF :

Cas Comportement
Un seul signataire Tous les champs détectés lui sont attribués.
Plusieurs signataires Vous devez fournir DefineRecipients, qui répartit les champs détectés entre les signataires ; sinon la certification échoue.
Plusieurs signataires, zones placées avec ZoneBuilder seulement Passez DetectExistingFields à false.
// Reçoit les signataires (chacun avec une liste vide) et les champs détectés ; retourne la répartition.
DefineRecipients = (zonesParSignataire, champsDetectes) =>
{
    var signataires = zonesParSignataire.Keys.ToList();
    foreach (var champ in champsDetectes)
    {
        if (champ.FieldName.StartsWith("client_")) zonesParSignataire[signataires[0]].Add(champ);
        else if (champ.FieldName.StartsWith("conseiller_")) zonesParSignataire[signataires[1]].Add(champ);
        else throw new InvalidOperationException("Champ hors convention dans le PDF");   // jamais d'attribution par défaut
    }
    return zonesParSignataire;
}

Les champs détectés que vous n'attribuez à aucun signataire sont passés en lecture seule avant la certification : personne ne peut les remplir, et ils gardent le contenu du PDF d'origine.

Erreurs fréquentes

Symptôme Cause probable Solution
Erreur « page hors limites » Numéro de page inférieur à 1 ou supérieur au nombre de pages Les pages commencent à 1.
Erreur à la création d'un texte multiligne, d'une liste d'options ou d'une liste déroulante ZoneBuilder créé sans le mode PKI Créez-le avec le mode PKI.
La certification échoue avec plusieurs signataires Champs détectés sans DefineRecipients Fournissez DefineRecipients, ou passez DetectExistingFields à false.
« File does not contain existing fields » DefineRecipients fourni pour un PDF sans champ Passez DetectExistingFields à false.
Une zone apparaît au mauvais endroit Origine prise en bas de page L'origine est le coin supérieur gauche ; voir Coordonnées.

Et ensuite