Esta página puede contener texto traducido automáticamente.

Firmar documentos PDF en C# y VB.NET

Las firmas digitales se utilizan para autenticar la identidad de un usuario y el contenido del documento PDF. Las firmas permiten acreditar que el documento PDF:

  • No ha sido modificado desde su firma.
  • Fue firmado digitalmente por una persona específica.

Agregue firma digital a PDF en C# y VB.NET

Biblioteca .NET para firmar documentos PDF

Utilice la biblioteca Docotic.Pdf para firmar documentos PDF en aplicaciones .NET Framework y .NET Core. Obtenga la biblioteca y una clave de licencia gratuita por tiempo limitado en la página Descargar la biblioteca PDF de C# .NET.

Biblioteca Docotic.Pdf 9.5.17615-dev Pruebas de regresión 14,813 pasaron Descargas totales de NuGet 4,924,084

Docotic.Pdf puede crear firmas digitales utilizando diferentes algoritmos de resumen (SHA-1, SHA-256, SHA-384, SHA-512, RIPEMD-160) y diferentes formatos de firma (adbe.pkcs7.detached o ETSI.CAdES.detached) . La biblioteca también puede verificar firmas de PDF.

Agregar firma digital a PDF en C#

Necesita un certificado digital PKCS#12 (archivo .pfx o .p12) emitido por una autoridad certificadora (CA) válida para firmar un documento PDF. Aquí está el ejemplo básico que muestra cómo firmar un documento 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");
}

Reemplace "your_cert.p12" y "your_cert_password" con su propio archivo de certificado y contraseña .p12 o .pfx. En GitHub, puede descargar y probar los ejemplos completos de Firmar documento PDF en C# y VB.NET.

Hay casos en los que es necesario firmar un documento ya firmado. O varias personas deberían firmar un formulario una tras otra. Esto también es posible. Los pasos son prácticamente los mismos. Solo asegúrese de firmar y guardar de forma incremental. Las actualizaciones incrementales no invalidan las firmas digitales si solo aplica los cambios permitidos.

Hay ejemplos de Firmar un documento PDF ya firmado y Firmar un formulario PDF por varias personas en C# y VB.NET para estos casos.

El código anterior agrega implícitamente un campo de firma invisible al documento PDF y lo usa para firmar. Veamos cómo agregar y personalizar campos de firma en PDF.

Firmar un documento PDF con una imagen de firma manuscrita

A menudo es necesario agregar una imagen de firma manuscrita al PDF además de la firma digital. Este ejemplo muestra cómo agregar una firma digital con una imagen asociada 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");
}

Este código agrega un campo de firma, asocia el campo con opciones de firma y personaliza la apariencia del campo. Puede mostrar texto, imagen o ambos en los campos de firma. Mire los ejemplos de clase PdfSignatureAppearanceOptions y Firmar un campo de firma usando un estilo personalizado para obtener más detalles.

Bloquear campos de formulario PDF con un campo de firma

Se puede utilizar un campo de firma para bloquear los campos del formulario PDF después de la firma. Este ejemplo muestra cómo bloquear campos de formulario específicos después de iniciar sesión en C#:

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

// cuando se firma el primer campo, los campos con los nombres 
// "some_text_field" y "some_checkbox" se bloquearán para su edición
first.Lock = PdfSignatureFieldLock.CreateLockFields("some_text_field", "some_checkbox");

Y el siguiente código muestra cómo bloquear todos los campos del formulario después de firmar:

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

// cuando el campo second esté firmado, todos los campos se bloquearán para editarlos
second.Lock = PdfSignatureFieldLock.CreateLockAll();

También puede bloquear todos los campos del formulario en el documento PDF, excepto los campos específicos. Utilice el método PdfSignatureFieldLock.CreateLockAllExceptFields para eso.

Descargue y pruebe los ejemplos completos Firmar campo de firma con candado en C# y VB.NET desde GitHub.

Incrustar marca de tiempo en una firma digital

Puede agregar seguridad adicional a una firma digital incorporando una marca de tiempo. Para ello, especifique la URL de la autoridad de marca de tiempo como una de las opciones de firma. También puede proporcionar un nombre de usuario y contraseña si es necesario.

Al firmar, la biblioteca obtendrá una marca de tiempo de la Autoridad de Marca de Tiempo y la incrustará en la firma.

Por motivos de compatibilidad, recomendamos utilizar uno de los algoritmos de resumen SHA para firmas con marca de tiempo.

// Reemplace la siguiente URL de prueba con su URL de autoridad de marca de tiempo
options.Timestamp.AuthorityUrl = new Uri("http://tsa.starfieldtech.com/");

// Especifique nombre de usuario y contraseña si 
// su autoridad de marca de tiempo requiere autenticación
options.Timestamp.Username = null;
options.Timestamp.Password = null;