private static Rectangle GetSignatureLocation(Rectangle cropBox, PdfSignatureParameters parameters)
 {
     return(new Rectangle(cropBox.GetLeft(parameters.SignatureLeftMargin),
                          cropBox.GetTop(parameters.SignatureYLocation + parameters.SignatureHeight),
                          cropBox.Width - parameters.SignatureRightMargin,
                          cropBox.GetTop(parameters.SignatureYLocation)));
 }
        private static string GetSignatureText(X509Certificate x509Certificate, PdfSignatureParameters parameters)
        {
            Dictionary <string, string> subjectFields = CertificateHelper.GetSubjectFields(x509Certificate);
            string surName   = subjectFields.Keys.Contains("SURNAME") ? subjectFields["SURNAME"] : string.Empty;
            string givenName = subjectFields.Keys.Contains("GIVENNAME") ? subjectFields["GIVENNAME"] : string.Empty;
            string signDate  = DateTime.Now.ToString("d.M.yyyy");

            return(parameters.SignatureTemplate
                   .Replace("{lastname}", UppercaseFirst(surName))
                   .Replace("{firstname}", UppercaseFirst(givenName))
                   .Replace("{signdate}", signDate));
        }
        public static string SignFile(string fileName, PdfSignatureParameters parameters, IDigitalSignatureCertificateSelector certificateSelector)
        {
            if (string.IsNullOrWhiteSpace(fileName))
            {
                throw new ArgumentException("Filename must be given", nameof(fileName));
            }
            if (!File.Exists(fileName))
            {
                throw new ArgumentException($"File {fileName} not found.");
            }
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            if (certificateSelector == null)
            {
                throw new ArgumentNullException(nameof(certificateSelector));
            }

            string tempPath = string.Empty;

            try
            {
                tempPath = GetTempPath(parameters.TempFolderPath);

                string targetFilePath = GetTargetFilePath(parameters.TempFolderPath, parameters.TargetFilePath);

                var signingCertificates = CertificateHelper.GetSigningCertificates(certificateSelector);

                // Two clients for checking certificate revocation
                // * Online Certificate Status Protocol (OCSP) client
                // * Certificate Revocation Lists (CRL) client with online checking
                // Certificate will be checked when the signature is made
                OcspClientBouncyCastle oscpClient = new OcspClientBouncyCastle(null);
                List <ICrlClient>      clrClients = new List <ICrlClient> {
                    new CrlClientOnline(signingCertificates.FinalChain)
                };

                using (FileStream targetFileStream = new FileStream(targetFilePath, FileMode.Create))
                    using (PdfReader reader = new PdfReader(fileName))
                        using (PdfStamper stamper = PdfStamper.CreateSignature(reader, targetFileStream, '0', tempPath, true))
                        {
                            PdfSignatureAppearance appearance = GetPdfSignatureAppearance(signingCertificates, stamper, reader, parameters);

                            CreateSignature(signingCertificates, appearance, clrClients, oscpClient);
                        }

                return(targetFilePath);
            }
            finally
            {
                try
                {
                    if (!string.IsNullOrWhiteSpace(tempPath) && File.Exists(tempPath))
                    {
                        File.Delete(tempPath);
                    }
                }
                catch (Exception)
                {
                }
            }
        }
        private static PdfSignatureAppearance GetPdfSignatureAppearance(SigningCertificates signingCertificates, PdfStamper stamper, PdfReader reader, PdfSignatureParameters parameters)
        {
            PdfSignatureAppearance appearance = stamper.SignatureAppearance;

            appearance.Reason          = "";
            appearance.LocationCaption = "";
            appearance.Location        = "";
            appearance.Layer4Text      = "";
            appearance.Layer2Text      = GetSignatureText(signingCertificates.X509Certificate, parameters);
            appearance.Acro6Layers     = true;

            Rectangle cropBox = reader.GetCropBox(parameters.SignaturePageNumber);

            Rectangle rectangle = GetSignatureLocation(cropBox, parameters);

            appearance.SetVisibleSignature(rectangle, parameters.SignaturePageNumber, parameters.SignatureName);

            return(appearance);
        }