Cómo firmar un PDF con iText Sharp - Blog de David Alonso. Microsoft SharePoint, Office 365, Azure y otras tecnologías Microsoft

Blog de David Alonso. Microsoft SharePoint, Office 365, Azure y otras tecnologías Microsoft

Microsoft SharePoint, Azure, Office 365

domingo, 8 de marzo de 2020

Cómo firmar un PDF con iText Sharp

Firmar un pdf en C# con iTextSharp

¿Qué es iText Sharp? 

iText Sharp es una adaptación a código CV# de la biblioteca iText, que se trata de una biblioteca Open Source para crear y manipular archivos PDF, RTF, y HTML en Java.

logo-dotnet-csharp

¿Qué significa firmar un documento pdf?

Firmar electrónicamente un documento, significa  asociar al documento una serie de datos cuyo objetivo es identificar al firmante de manera inequívoca. 

Además, asegura la integridad del documento, es decir el documento que se ha firmado es exactamente el mismo que el original por lo que no ha sufrido ninguna modificación. 

Para más información sobre la firma electrónica, puede acceder al portal de administración electrónica haciendo clic en el siguiente enlace.

Firmar documento pdf programáticamente con c#

A continuación adjunto el código fuente para firmar el documento pdf con C#.  Lo primero que habría que hacer es añadir con Nugget la librería iText. 



 public static void FirmaPDF(string unsignedDocument, string signedDocument,
                                        int x, int y, int width, int height,
                                        string certFileNamePath,
                                        int pageToSign , string password)
    {
      FileStream certificado = new FileStream(certFileNamePath, FileMode.Open);
      Org.BouncyCastle.Pkcs.Pkcs12Store store = new Org.BouncyCastle.Pkcs.Pkcs12Store(certi, ((String)password).ToCharArray());
      String alias = "";
      System.Collections.Generic.ICollection chain = new System.Collections.Generic.List();
      // searching for private key   
      foreach (string al in store.Aliases)
        if (store.IsKeyEntry(al) && store.GetKey(al).Key.IsPrivate)
        {
          alias = al;
          break;
        }
      Org.BouncyCastle.Pkcs.AsymmetricKeyEntry pk = store.GetKey(alias);
      foreach (Org.BouncyCastle.Pkcs.X509CertificateEntry c in store.GetCertificateChain(alias))
        chain.Add(c.Certificate);
      Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters parameters = pk.Key as Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters;
      iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(unsignedDocument);
      FileStream os = new FileStream(signedDocument, FileMode.Create);
      iTextSharp.text.pdf.PdfStamper stamper = iTextSharp.text.pdf.PdfStamper.CreateSignature(reader, os, '\0',null, true);      

      // Creating the appearance
      iTextSharp.text.pdf.PdfSignatureAppearance appearance = stamper.SignatureAppearance;
      iTextSharp.text.Font font = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 8, iTextSharp.text.Font.ITALIC, iTextSharp.text.BaseColor.BLACK);
      appearance.Layer2Font = font;
      appearance.SignatureRenderingMode = iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode.DESCRIPTION;
      appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(x, y, width, height), 1, "sig");
      appearance.Layer2Text = "Firmado digitalmente:" + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
      // Creating the signature
      iTextSharp.text.pdf.security.IExternalSignature pks = new iTextSharp.text.pdf.security.PrivateKeySignature(parameters, iTextSharp.text.pdf.security.DigestAlgorithms.SHA256);
      iTextSharp.text.pdf.security.MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, iTextSharp.text.pdf.security.CryptoStandard.CMS);

      certificado.Close();     
    }


NOTAS:
  •  En la siguiente función, además de firmar, se adjunta en una posición del documento (concretamente en la página que se envía como parámetro pageToSign) un cuadro con texto. El bloque que añade este texto es el comentado como "Creating the appearance". El cuadro de texto tendrá las posiciones, ancho y alto que recibe como parámetros de la función. También se podría añadir una imagen, o texto propio del certificado sin modificar la Layer.  
  • Se utilizan dos rutas de fichero. Signeddocument será la ruta donde está el fichero a firmar y 
  • Si se quiere permitir más de una firma en el documento, hay que fijarse en la siguiente línea:

iTextSharp.text.pdf.PdfStamper stamper = iTextSharp.text.pdf.PdfStamper.CreateSignature(reader, os, '\0',null, true); 
En ella, el último parámetro a true permite adjuntar más de una firma en el documento. En caso contrario, cuando se añada una nueva firma, se invalidará la primera.

No hay comentarios:

Publicar un comentario