/// <summary> /// Sign (fill) named field in the document soft way (using existing stamper) /// </summary> /// <param name="stamper">PdfStamper</param> /// <param name="fieldName">Field to be signed</param> /// <param name="reason">Sign reason</param> /// <param name="location">Sign location</param> /// <param name="graphics">Sign graphic</param> /// <param name="certFile">PFX certificate</param> /// <param name="certPassword">password of certificate</param> /// <param name="renderingMode">SignatureRender renderingMode</param> /// <param name="certificationLevel">PdfSignatureAppearance Certification Level</param> /// <returns>Successfull or not</returns> public static bool SignField(ref PdfStamper stamper, string fieldName, string reason, string location, Bitmap graphics, string certFile, string certPassword, PdfSignatureAppearance.SignatureRender renderingMode = PdfSignatureAppearance.SignatureRender.GraphicAndDescription, int certificationLevel = PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED) { bool result = false; try { if (stamper.Reader.AcroFields.Fields.ContainsKey(fieldName)) { PdfSignatureAppearance psa = GetPSA(fieldName, stamper, graphics, reason, location, renderingMode, certificationLevel); Pkcs12Store store = new Pkcs12Store(new FileStream(certFile, FileMode.Open), certPassword.ToCharArray()); string alias = ""; ICollection <X509Certificate> chain = new List <X509Certificate>(); foreach (string al in store.Aliases) { if (store.IsKeyEntry(al) && store.GetKey(al).Key.IsPrivate) { alias = al; break; } } AsymmetricKeyEntry ake = store.GetKey(alias); foreach (X509CertificateEntry c in store.GetCertificateChain(alias)) { chain.Add(c.Certificate); } RsaPrivateCrtKeyParameters parameters = ake.Key as RsaPrivateCrtKeyParameters; psa.SetCrypto(parameters, chain.ToArray(), null, PdfSignatureAppearance.WINCER_SIGNED); result = true; } else { result = false; } } catch (Exception e) { Console.WriteLine(e.Message); result = false; } return(result); }
private static PdfSignatureAppearance GetPSA(string fieldName, PdfStamper stamper, Bitmap graphics, string reason, string location, PdfSignatureAppearance.SignatureRender renderingMode, int certLevel) { PdfSignatureAppearance psa = stamper.SignatureAppearance; psa.Acro6Layers = true; psa.SignatureGraphic = iTextSharp.text.Image.GetInstance(graphics, ImageFormat.Png); psa.Render = renderingMode; psa.CertificationLevel = certLevel; psa.Reason = reason; psa.Location = location; psa.SetVisibleSignature(fieldName); return(psa); }