Cette page peut contenir du texte traduit automatiquement.

Signer des documents PDF en C# et VB.NET

Les signatures numériques sont utilisées pour authentifier l'identité d'un utilisateur et le contenu du document PDF. Les signatures permettent de prouver que le document PDF:

  • N'a pas été modifié depuis sa signature.
  • A été signé numériquement par une personne spécifique.

Ajouter une signature numérique au PDF en C# et VB.NET

Bibliothèque .NET pour signer des documents PDF

Utilisez la bibliothèque Docotic.Pdf pour signer des documents PDF dans les applications .NET Framework et .NET Core. Obtenez la bibliothèque et une clé de licence gratuite à durée limitée sur la page Télécharger la bibliothèque PDF C# .NET.

Bibliothèque Docotic.Pdf 9.5.17615-dev Tests de régression 14,813 réussis Téléchargements totaux de NuGet 4,924,084

Docotic.Pdf peut créer des signatures numériques en utilisant différents algorithmes de résumé (SHA-1, SHA-256, SHA-384, SHA-512, RIPEMD-160) et différents formats de signature (adbe.pkcs7. détachés ou ETSI.CAdES. détachés) . La bibliothèque peut également vérifier les signatures PDF.

Ajouter une signature numérique au PDF en C#

Vous avez besoin d'un certificat numérique PKCS#12 (fichier .pfx ou .p12) délivré par une autorité de certification (CA) valide pour signer un document PDF. Voici l'exemple de base qui montre comment signer un document PDF en C# :

using BitMiracle.Docotic.Pdf;

using (var pdf = new PdfDocument("document_to_sign.pdf"))
{
    var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.Pkcs7Detached,
        Reason = "Testing digital signatures",
        Location = "My workplace",
        ContactInfo = "support@example.com"
    };

    pdf.SignAndSave(options, "signed.pdf");
}

Remplacez «votre_cert.p12» et «votre_cert_password» par votre propre fichier de certificat .p12 ou .pfx et votre mot de passe. Sur GitHub, vous pouvez télécharger et essayer les exemples complets de Sign PDF document en C# et VB.NET.

Il existe des cas où vous devez signer un document déjà signé. Ou alors, plusieurs personnes doivent signer un formulaire l’une après l’autre. C'est également possible. Les étapes sont pour la plupart les mêmes. Assurez-vous simplement de signer et d’enregistrer progressivement. Les mises à jour incrémentielles n'invalident pas les signatures numériques si vous appliquez uniquement les modifications autorisées.

Il existe des exemples de Signer un document PDF déjà signé et de Signer un formulaire PDF par plusieurs personnes en C# et VB.NET pour ces cas.

Le code ci-dessus ajoute implicitement un champ de signature invisible au document PDF et l'utilise pour la signature. Voyons comment ajouter et personnaliser des champs de signature dans un PDF.

Signer un document PDF avec une image de signature manuscrite

Vous devez souvent ajouter une image de signature manuscrite au PDF en plus de la signature numérique. Cet exemple montre comment ajouter une signature numérique avec une image associée en C# :

using (var pdf = new PdfDocument("document_to_sign.pdf"))
{
    var options = new PdfSigningOptions("your_cert.p12", "your_cert_password")
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.Pkcs7Detached,
    };

    PdfSignatureField field = pdf.Pages[0].AddSignatureField(20, 20, 100, 50);
    options.Field = field;

    PdfImage image = pdf.AddImage("your_signature.jpg");
    options.Appearance.Image = image;
    options.Appearance.HideAllText();

    pdf.SignAndSave(options, "signed.pdf");
}

Ce code ajoute un champ de signature, associe le champ aux options de signature et personnalise l'apparence du champ. Vous pouvez afficher du texte, une image ou les deux dans les champs de signature. Consultez les exemples de Classe PdfSignatureAppearanceOptions et de Signer un champ de signature à l'aide d'un style personnalisé pour plus de détails.

Verrouiller les champs du formulaire PDF avec un champ de signature

Un champ de signature peut être utilisé pour verrouiller les champs du formulaire PDF après la signature. Cet exemple montre comment verrouiller des champs de formulaire spécifiques après la connexion en C# :

var first = page.AddSignatureField("first", 100, 100, 200, 50);

// lorsque le champ first est signé, les champs avec les noms 
// "some_text_field" et "some_checkbox" seront verrouillés pour l'édition
first.Lock = PdfSignatureFieldLock.CreateLockFields("some_text_field", "some_checkbox");

Et le code suivant montre comment verrouiller tous les champs du formulaire après la signature :

var second = page.AddSignatureField("second", 100, 200, 200, 50);

// lorsque le deuxième champ est signé, tous les champs seront verrouillés pour l'édition
second.Lock = PdfSignatureFieldLock.CreateLockAll();

Vous pouvez également verrouiller tous les champs de formulaire du document PDF, à l'exception des champs spécifiques. Utilisez la méthode PdfSignatureFieldLock.CreateLockAllExceptFields pour cela.

Téléchargez et essayez les exemples complets de Signer le champ de signature avec un verrou en C# et VB.NET à partir de GitHub.

Intégrer l'horodatage dans une signature numérique

Vous pouvez ajouter une sécurité supplémentaire à une signature numérique en intégrant un horodatage. Pour cela, spécifiez l'URL de l'autorité d'horodatage comme l'une des options de signature. Vous pouvez également fournir un nom d'utilisateur et un mot de passe si nécessaire.

Lors de la signature, la bibliothèque recevra un horodatage de la part de l'autorité d'horodatage et l'intégrera dans la signature.

Pour des raisons de compatibilité, nous vous recommandons d'utiliser l'un des algorithmes de résumé SHA pour les signatures horodatées.

// Remplacez l'URL de test suivante par votre URL d'autorité d'horodatage
options.Timestamp.AuthorityUrl = new Uri("http://tsa.starfieldtech.com/");

// Spécifiez le nom d'utilisateur et le mot de passe si
// votre autorité d'horodatage nécessite une authentification
options.Timestamp.Username = null;
options.Timestamp.Password = null;