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

Firmar documentos PDF en C# y VB.NET

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

  • No ha sido modificado desde que se firmó.
  • Fue firmado digitalmente por una persona específica.

Agregar una firma digital a un PDF en C# y VB.NET

Biblioteca .NET para firmar documentos PDF

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

Docotic.Pdf puede crear firmas digitales usando 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 PDF.

Agregar una firma digital a un PDF en C#

Necesita un certificado digital PKCS#12 (.pfx o .p12) emitido por una autoridad de certificación (CA) válida para firmar un documento PDF. Este es 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" por su propio archivo de certificado .p12 o .pfx y su contraseña. En GitHub, puede descargar y probar los ejemplos completos de Firmar un documento PDF en C# y VB.NET.

Hay casos en los que necesita firmar un documento ya firmado. O varias personas deben firmar un formulario una tras otra. Esto también es posible. Los pasos son casi los mismos. Solo asegúrese de firmar y guardar de forma incremental. Las actualizaciones incrementales no invalidan las firmas digitales si solo aplica 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 firmarlo. Veamos cómo agregar y personalizar campos de firma en PDF.

Firmar un documento PDF con una imagen de firma manuscrita

A menudo necesita agregar una imagen de firma manuscrita a 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.CreateImage("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 las opciones de firma y personaliza la apariencia del campo. Puede mostrar texto, una imagen o ambos en los campos de firma. Consulte la clase PdfSignatureAppearanceOptions y los ejemplos de Firmar un campo de firma usando un estilo personalizado para obtener más detalles.

Bloquear campos de formulario PDF con un campo de firma

Un campo de firma se puede usar para bloquear campos de formulario PDF después de la firma. Este ejemplo muestra cómo bloquear campos de formulario específicos después de firmar en C#:

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

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

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

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

// cuando se firme el segundo campo, todos los campos quedarán bloqueados para edición
second.Lock = PdfSignatureFieldLock.CreateLockAll();

También puede bloquear todos los campos de formulario en el documento PDF excepto los campos específicos. Para ello, use el método PdfSignatureFieldLock.CreateLockAllExceptFields.

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

Incrustar una marca de tiempo en una firma digital

Puede agregar seguridad adicional a una firma digital incrustando 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 una 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 usar uno de los algoritmos de resumen SHA para firmas con marca de tiempo.

// Reemplace la siguiente URL de prueba por la URL de su 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;