public static void SignPdfCert(String SRC, String DEST, String Reason, String Location, String certPassword, String certFile, String llx, String lly, String urx, String ury, int fontSize)
{
Pkcs12Store p12ks = new Pkcs12Store();
FileStream fs = new FileStream(certFile, FileMode.Open);
p12ks.Load(fs, certPassword.ToCharArray());
String alias = "";
foreach (String al in p12ks.Aliases)
{
if (p12ks.IsKeyEntry(al) && p12ks.GetKey(al).Key.IsPrivate)
{
alias = al;
break;
}
}
AsymmetricKeyParameter pk = p12ks.GetKey(alias).Key;
ICollection<X509Certificate> chain = new List<X509Certificate>();
foreach (X509CertificateEntry entry in p12ks.GetCertificateChain(alias))
{
chain.Add(entry.Certificate);
}
fs.Close();
//Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
//Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData) };
IExternalSignature externalSignature = new PrivateKeySignature(pk, DigestAlgorithms.SHA512);
PdfReader pdfReader = new PdfReader(SRC);
FileStream signedPdf = new FileStream(DEST, FileMode.Create); //the output pdf file
Program.logLine("page size" + pdfReader.GetPageSize(1));
PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0');
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
//here set signatureAppearance at your will
signatureAppearance.Reason = Reason;
signatureAppearance.Location = Location;
BaseFont bf = BaseFont.CreateFont();
signatureAppearance.Layer2Font = new Font(bf, fontSize);
signatureAppearance.SetVisibleSignature(new Rectangle(float.Parse(llx), float.Parse(lly), float.Parse(urx), float.Parse(ury)), 1, "sig");
//signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
//MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CADES);
}