Signer numériquement un document PDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

Désambiguïsation importante : Signature d'un PDF

Les développeurs demandent souvent comment ils peuvent ajouter par programme une signature à un document PDF à l'aide d'IronPDF. En général, la signature a des significations différentes selon les développeurs :

  1. Pour signer numériquement un document PDF à l'aide d'un certificat afin de s'assurer qu'il ne peut pas être falsifié.

  2. Pour ajouter une image de signature manuscrite à un PDF existant à partir d'un fichier image.

  3. Pour apposer l'image d'un certificat sur un PDF.

  4. Pour ajouter un champ de formulaire de signature à un PDF que certaines visionneuses peuvent inviter à signer.

    Commencez avec IronPDF

    Commencez à utiliser IronPDF dans votre projet dès aujourd'hui avec un essai gratuit.

    Première étape :
    green arrow pointer


Signer un PDF à l'aide d'un certificat numérique

IronPDF supporte de nombreuses façons de signer un PDF avec un certificat de signature numérique aux formats .pfx et .p12. Dans ce guide pratique, vous serez guidé à travers les trois principales méthodes utilisées pour signer numériquement les documents PDF :

Méthode de signatureDescription
SigneSigner un PDF avec un Objet PdfSignature
SignWithFileSigner un PDF avec un certificat de signature numérique (.pfx ou .p12) sur le disque
SignWithStoreSigne le PDF à l'aide d'une signature numérique extraite de la mémoire de signature de votre ordinateur. Sur la base d'une empreinte de pouce

Fichiers de certificats de signature numérique pris en charge

Nous respectons officiellement la norme X509Certificate2 et prenons en charge les signatures .pfx et .p12. Si votre signature ne peut pas être appliquée directement dans les méthodes de signature d'IronPdf, vous devrez créer un certificat X509Certificate2 avec les instructions qui peuvent être trouvées sur le site web de laDocumentation Microsoft.

Signer : Créer une signature Pdf à partir d'un certificat X5092

Les méthodes de signature d'IronPDF acceptent les objets X509Certificate2 avec X509KeyStorageFlags réglé sur Exportable.

[{i :(

  • IronPDF ne prend en charge que X509KeyStorageFlags.Exportable. Pour certains certificats, KeyStorageFlags est défini par défaut sur Exportable. Toute tentative d'utilisation de KeyStorageFlags différents entraîne une exception => Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException : 'The requested operation is not supported.' (L'opération demandée n'est pas prise en charge)

    )}]

:path=/static-assets/pdf/content-code-examples/how-to/signing-X509Certificate2-with-privatekey.cs
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>foo</h1>");

// Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);

// Create PdfSignature object
var sig = new PdfSignature(cert);

// Sign PDF document
pdf.Sign(sig);

pdf.SaveAs("signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates

Private renderer As New ChromePdfRenderer()
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>foo</h1>")

' Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
Private cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)

' Create PdfSignature object
Private sig = New PdfSignature(cert)

' Sign PDF document
pdf.Sign(sig)

pdf.SaveAs("signed.pdf")
VB   C#

Signer : ajouter des détails granulaires à PdfSignature

Lors de l'instanciation de PdfSignature ou après son instanciation, des informations utiles peuvent être ajoutées à l'objet PdfSignature, notamment la date, le contact signataire, l'emplacement, la raison de la signature, l'horodatage et l'ajout d'une image en tant qu'apparence visuelle sur le document PDF.

Conseils
Prise en charge des serveurs d'horodatage qui requièrent SHA256 et SHA512

:path=/static-assets/pdf/content-code-examples/how-to/signing-add-granular-information.cs
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>foo</h1>");

pdf.SaveAs("signed.pdf");

// Create PdfSignature object
var sig = new PdfSignature("IronSoftware.pfx", "123456");

// Add granular information
sig.SignatureDate = new DateTime(2000, 12, 02);
sig.SigningContact = "IronSoftware";
sig.SigningLocation = "Chicago";
sig.SigningReason = "How to guide";
sig.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256;
sig.TimeStampUrl = "http://timestamp.digicert.com";
sig.SignatureImage = new PdfSignatureImage("IronSoftware.png", 0, new Rectangle(0, 600, 100, 100));

// Sign and save PDF document
sig.SignPdfFile("signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports System

Private renderer As New ChromePdfRenderer()
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>foo</h1>")

pdf.SaveAs("signed.pdf")

' Create PdfSignature object
Dim sig = New PdfSignature("IronSoftware.pfx", "123456")

' Add granular information
sig.SignatureDate = New DateTime(2000, 12, 02)
sig.SigningContact = "IronSoftware"
sig.SigningLocation = "Chicago"
sig.SigningReason = "How to guide"
sig.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256
sig.TimeStampUrl = "http://timestamp.digicert.com"
sig.SignatureImage = New PdfSignatureImage("IronSoftware.png", 0, New Rectangle(0, 600, 100, 100))

' Sign and save PDF document
sig.SignPdfFile("signed.pdf")
VB   C#

Démonstration

Il se peut qu'un point d'exclamation ou un signe d'avertissement s'affiche au lieu d'une coche. Cela est dû au fait qu'Adobe ne peut pas confirmer l'authenticité et l'intégrité du document puisque le certificat n'est pas présent. Pour obtenir la coche, veuillez ajouter le certificat à Adobe et rouvrir le document.

Différentes façons d'ajouter une image

L'image peut être incluse de différentes manières :

  • Définir la propriété SignatureImage à un nouvel objet PdfSignatureImage.
  • Utilisez la méthode LoadSignatureImageFromFile pour charger une image à partir d'un fichier. La méthode LoadSignatureImageFromFile prend en charge différents formats d'image.
  • Utilisez la méthode LoadSignatureImageFromStream pour charger une image à partir d'un flux. Le flux d'images peut être généré à partir d'autres bibliothèques à condition qu'il ait les formats TGA, PBM, TIFF, BMP, GIF, PNG, JPEG, Webp.
:path=/static-assets/pdf/content-code-examples/how-to/signing-add-image.cs
using IronPdf.Signing;
using IronSoftware.Drawing;

// Create PdfSignature object
var sig = new PdfSignature("IronSoftware.pfx", "123456");

// Add image by property
sig.SignatureImage = new PdfSignatureImage("IronSoftware.png", 0, new Rectangle(0, 600, 100, 100));

// Add image by LoadSignatureImageFromFile method
sig.LoadSignatureImageFromFile("IronSoftware.png", 0, new Rectangle(0, 600, 100, 100));

// Import image using IronSoftware.Drawing
AnyBitmap image = AnyBitmap.FromFile("IronSoftware.png");

sig.LoadSignatureImageFromStream(image.ToStream(), 0, new Rectangle(0, 600, 100, 100));
Imports IronPdf.Signing
Imports IronSoftware.Drawing

' Create PdfSignature object
Private sig = New PdfSignature("IronSoftware.pfx", "123456")

' Add image by property
sig.SignatureImage = New PdfSignatureImage("IronSoftware.png", 0, New Rectangle(0, 600, 100, 100))

' Add image by LoadSignatureImageFromFile method
sig.LoadSignatureImageFromFile("IronSoftware.png", 0, New Rectangle(0, 600, 100, 100))

' Import image using IronSoftware.Drawing
Dim image As AnyBitmap = AnyBitmap.FromFile("IronSoftware.png")

sig.LoadSignatureImageFromStream(image.ToStream(), 0, New Rectangle(0, 600, 100, 100))
VB   C#

Droits de signature

Vous pouvez spécifier explicitement les conditions dans lesquelles votre certificat restera valide. Si vous souhaitez que votre signature soit invalidée en cas de modification, ou qu'elle ne permette que des modifications de champs de formulaire, etc., veuillez utiliser le tableau suivant pour voir les options :

PdfDocument.SignaturePermissionsDéfinition
Pas de changement autoriséAucune modification n'est autorisée
FormFillingAllowedModification des valeurs des champs de formulaire autorisée
FormFillingAndAnnotationsAllowed (Remplissage et annotations autorisés)Modification des valeurs des champs de formulaire et modification des annotations autorisées

Ce paramètre est facultatif. S'il n'est pas défini, une signature certifiant une révision spécifique sera appliquée et ne pourra pas être invalidée.

Enregistrer et signer un PDF Itération de révision

Dans l'exemple suivant, nous ouvrons un fichier PDF, nous y apportons diverses modifications, puis nous le signons avant de l'enregistrer. Pour les autorisations de signature, nous n'autoriserons que le remplissage de formulaires pour les éditions futures ; dans le cas contraire, la signature sera invalidée par toute autre modification.

Nous appellerons ensuite SaveAsRevision pour enregistrer la révision dans l'historique, puis nous enregistrerons notre nouveau document sur le disque.

:path=/static-assets/pdf/content-code-examples/how-to/signing-revision.cs
using IronPdf;
using IronPdf.Rendering;

// Import PDF and enable TrackChanges
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf", TrackChanges: ChangeTrackingModes.EnableChangeTracking);
// ... various edits ...
pdf.SignWithFile("/assets/IronSignature.p12", "password", null, IronPdf.Signing.SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed);

PdfDocument pdfWithRevision = pdf.SaveAsRevision();

pdfWithRevision.SaveAs("annual_census_2.pdf");
Imports IronPdf
Imports IronPdf.Rendering

' Import PDF and enable TrackChanges
Private pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf", TrackChanges:= ChangeTrackingModes.EnableChangeTracking)
' ... various edits ...
pdf.SignWithFile("/assets/IronSignature.p12", "password", Nothing, IronPdf.Signing.SignaturePermissions.AdditionalSignaturesAndFormFillingAllowed)

Dim pdfWithRevision As PdfDocument = pdf.SaveAsRevision()

pdfWithRevision.SaveAs("annual_census_2.pdf")
VB   C#

Comprendre l'enregistrement incrémentiel des signatures

Alors que certaines visionneuses comme les navigateurs Chrome n'affichent qu'une seule version, les fichiers PDF ont la capacité de stocker les versions précédentes du document, à l'instar d'un historique des livraisons Git. Vous verrez cela dans des visionneurs de PDF plus avancés tels qu'Adobe Acrobat.

Lorsqu'il s'agit de signatures de PDF, il est important de le savoir car l'action de signer un PDF s'applique à l'itération actuelle du PDF. Votre PDF peut comporter des signatures pour des itérations plus anciennes ou quelques versions non signées. Nous pouvons visualiser un exemple comme suit :

Itération du document PDFCertificat ACertificat BCertificat C#Certificat D
(première sauvegarde)

(modification des champs du formulaire uniquement)

(modification des champs du formulaire uniquement)
(seulement les champs de formulaire édités)

(aucune autre modification n'est autorisée)

(aucune autre modification n'est autorisée)

(aucune autre modification n'est autorisée)

Ci-dessus, nous avons des documents qui ont fait l'objet de 6 itérations différentes. Ce document peut être transmis aux différents services d'une entreprise pour approbation jusqu'à ce qu'il soit finalisé à l'itération 3. Dans cette itération, la personne A et la personne B ont toutes deux signé le document avec l'autorisation "Modifications des champs du formulaire uniquement". Cela signifie qu'il est permis de remplir les champs du formulaire dans le document PDF, mais que toute autre modification du document invalidera leurs signatures.

Dans l'exemple ci-dessus, nous pouvons supposer que la personne C# est celle qui a rempli le formulaire et l'a renvoyé aux personnes A, B et D qui ont toutes signé le document une dernière fois avec l'autorisation "Aucune modification autorisée". Étant donné qu'aucune action d'invalidation n'a été entreprise dans ce document, lorsque nous exécutons la méthode de signature d'IronPDF, nous obtenons vrai.

Revenir à une ancienne révision

Pour revenir à une révision précédente d'un PDF, vous pouvez utiliser la méthode GetRevision. Cette opération a pour effet d'oublier toutes les modifications apportées depuis cette révision, y compris les signatures plus récentes. Pour ce faire, utilisez :

:path=/static-assets/pdf/content-code-examples/how-to/signing-revert-revision.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("report.pdf");

int versions = pdf.RevisionCount; // total revisions

PdfDocument rolledBackPdf = pdf.GetRevision(2);
rolledBackPdf.SaveAs("report-draft.pdf");
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("report.pdf")

Private versions As Integer = pdf.RevisionCount ' total revisions

Private rolledBackPdf As PdfDocument = pdf.GetRevision(2)
rolledBackPdf.SaveAs("report-draft.pdf")
VB   C#

Supprimer les signatures

IronPDF dispose d'une méthode RemoveSignatures qui supprime toutes les signatures de toutes les révisions d'un document PDF. L'utilisation est la suivante :

:path=/static-assets/pdf/content-code-examples/how-to/signing-remove-signature.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("invoice.pdf");
pdf.RemoveSignatures();
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("invoice.pdf")
pdf.RemoveSignatures()
VB   C#

Vérifier toutes les signatures dans un PDF

L'appel de la méthode de vérification des signatures sur un document PDF permet d'examiner toutes les signatures de toutes les itérations du document et de vérifier qu'elles sont toujours valides. Ceci retournera un bool de true si elles sont toutes valides.

:path=/static-assets/pdf/content-code-examples/how-to/signing-verify-signatures.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
bool isValid = pdf.VerifyPdfSignatures();
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
Private isValid As Boolean = pdf.VerifyPdfSignatures()
VB   C#

Apposer une signature sur un PDF

Tout d'abord, je commencerai par un PDF que je souhaite signer. J'utiliserai cet exemple de facture :

Nous appliquerons une signature manuscrite sous forme d'image .png à notre PDF. Il peut s'agir d'une signature manuscrite ou de l'image utilisée pour la création d'un fichier de certificat. Il s'agit de l'exemple de signature que nous utiliserons :

Signature related to Apposer une signature sur un PDF

Code

Nous utiliserons le code suivant pour apposer la signature manuscrite en filigrane sur le PDF :

:path=/static-assets/pdf/content-code-examples/how-to/signing-handwritten.cs
using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("invoice.pdf");

pdf.ApplyWatermark("<img src='signature.png'/>", 90, VerticalAlignment.Bottom, HorizontalAlignment.Right);

pdf.SaveAs("official_invoice.pdf");
Imports IronPdf
Imports IronPdf.Editing

Private pdf = PdfDocument.FromFile("invoice.pdf")

pdf.ApplyWatermark("<img src='signature.png'/>", 90, VerticalAlignment.Bottom, HorizontalAlignment.Right)

pdf.SaveAs("official_invoice.pdf")
VB   C#

Résultat de la sortie

Une fois ce code exécuté, nous obtenons ce fichier de sortie qui porte notre signature en bas à droite :


Ajouter un champ de signature non signé à un PDF

Pour ajouter un champ de formulaire de signature non signé ou vide, vous devez d'abord créer le champ de formulaire de signature en instanciant l'objet de signature. Ensuite, sur le document PDF cible, accédez à la propriété Form et passez l'objet de signature nouvellement créé à la méthode Add. Enfin, exportez le PDF avec le formulaire de signature vide.

:path=/static-assets/pdf/content-code-examples/how-to/signing-unsigned-signature.cs
using IronPdf;
using IronSoftware.Forms;

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>testing</h1>");

// Configure required parameters
string name = "cert";
uint pageIndex = 0;
double x = 100;
double y = 600;
double width = 300;
double height = 100;

// Create signature
SignatureFormField signature = new SignatureFormField(name, pageIndex, x, y, width, height);

// Add signature
pdf.Form.Add(signature);

pdf.SaveAs("signature.pdf");
Imports IronPdf
Imports IronSoftware.Forms

Private renderer As New ChromePdfRenderer()
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>testing</h1>")

' Configure required parameters
Private name As String = "cert"
Private pageIndex As UInteger = 0
Private x As Double = 100
Private y As Double = 600
Private width As Double = 300
Private height As Double = 100

' Create signature
Private signature As New SignatureFormField(name, pageIndex, x, y, width, height)

' Add signature
pdf.Form.Add(signature)

pdf.SaveAs("signature.pdf")
VB   C#
Signature non signée

Pour en savoir plus sur IronPDF et les formulaires qu'il prend en charge, consultez la rubriqueComment créer des formulaires PDF article.