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))
{
PdfStamper stamper = PdfStamper.CreateSignature(reader, targetFileStream, '0', tempPath, true);
PdfSignatureAppearance appearance = GetPdfSignatureAppearance(signingCertificates, stamper, reader, parameters);
CreateSignature(signingCertificates, appearance, clrClients, oscpClient);
}
return targetFilePath;
}
finally
{
if (!string.IsNullOrWhiteSpace(tempPath) && File.Exists(tempPath))
{
File.Delete(tempPath);
}
}
}