c# - 如何在使用 iTextsharp 签署 pdf 时优化时间
问题描述
我在 C# 项目中使用 iTextsharp 5.5.13.0 使用智能卡 (X509Certificate2) 对 pdf 文件进行签名。加盖签名的过程很好,但签名所需的时间比此过程的早期版本(iTextsharp 4.1.2.0)要多得多。
以前,从选择证书到完成签名过程不超过 10 秒,现在需要两倍多。
这是签署 pdf 的代码。我还附上了签名所需时间的图片。我可以做些什么来减少签名时间?
public static void SignHashed(string Source, string Target, X509Certificate2 Certificate, string Reason, string Location, bool AddTimeStamp, string strTSA)
{
X509CertificateParser objCP = new X509CertificateParser();
X509Certificate[] objChain = new X509Certificate[] { objCP.ReadCertificate(Certificate.RawData) };
IList<ICrlClient> crlList = new List<ICrlClient>();
crlList.Add(new CrlClientOnline(objChain));
PdfReader objReader = new PdfReader(Source);
PdfStamper objStamper = PdfStamper.CreateSignature(objReader, new FileStream(Target, FileMode.Create), '\0', null, true);
int pageNumber = objReader.NumberOfPages;
ITSAClient tsaClient = null;
IOcspClient ocspClient = null;
if (AddTimeStamp)
{
OcspVerifier ocspVerifier = new OcspVerifier(null, null);
ocspClient = new OcspClientBouncyCastle(ocspVerifier);
tsaClient = new TSAClientBouncyCastle(strTSA);
}
PdfSignatureAppearance signatureAppearance = objStamper.SignatureAppearance;
signatureAppearance.Reason = Reason;
signatureAppearance.Location = Location;
signatureAppearance.Acro6Layers = true;
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION;
signatureAppearance.SetVisibleSignature(new Rectangle(50, 10, 200, 66), pageNumber, null);
IExternalSignature externalSignature = new X509Certificate2Signature(Certificate, "SHA-1");
// this process take to much time
MakeSignature.SignDetached(signatureAppearance, externalSignature, objChain, crlList, ocspClient, tsaClient, 0, CryptoStandard.CMS);
if (objReader != null)
{
objReader.Close();
}
if (objStamper != null)
{
objStamper.Close();
}
}
解决方案
推荐阅读
- c# - C# WPF - 从工作线程访问在 UI 线程上创建的对象而不阻塞
- android - 支持的最低 Gradle 版本为 4.6
- java - 使用 Spring Boot 后端处理从 Angular 4 上传的 Multipart CSV 文件?
- angular - 尝试使用带有云功能端点的 Sendgrid 在 Angular 6 中发送电子邮件
- php - 如何检索另一个表中每个用户的最后一行?它有两张桌子
- angular - nativescript 联系人 | 如何按号码搜索联系人,例如 getContactsByNumber(number)
- c# - 如何弹出模态页面将其数据传递到主页?
- html - 将包装器拉伸到其内容的全宽
- docker - Kubernetes 阻止容器自动重启
- apache - 为什么启用 cleartrust 会覆盖我在 Apache 中的 shibboleth 设置?