Javascript 如何在asp.net的itextsharp中制作可下载的正确pdf文件并进行验证?
我已经用itextsharp创建了一个PDF文件,效果很好。我已经创建了一个Activex控件,在客户端使用USB令牌对PDF文件进行数字签名。客户端使用其USB令牌对PDF文件进行数字签名,PDF文件存储在服务器上,其他授权人员可以下载该文件。 Activex只需获取一个PDF文件,并对该PDF文件进行数字签名和临时存储,然后使用itextsharp库的PdfEncodings类将该PDF文件作为base64字符串返回。 为了使用Activex对象,我创建了两个asp.net隐藏字段,一个用于unsigned,另一个用于signed PDF。创建PDF文件后,我将其转换为base64字符串,然后将其分配给asp.net隐藏字段,然后调用javascript函数使用Activex控件进行签名,然后将该值分配给另一个asp.net隐藏字段,然后获取该值并使其可下载,但当下载PDF时,它表示PDF已损坏。我检查了临时文件夹中的PDF文件是否正确 activex控件中的pdf数字签名代码Javascript 如何在asp.net的itextsharp中制作可下载的正确pdf文件并进行验证?,javascript,asp.net,pdf,itextsharp,activexobject,Javascript,Asp.net,Pdf,Itextsharp,Activexobject,我已经用itextsharp创建了一个PDF文件,效果很好。我已经创建了一个Activex控件,在客户端使用USB令牌对PDF文件进行数字签名。客户端使用其USB令牌对PDF文件进行数字签名,PDF文件存储在服务器上,其他授权人员可以下载该文件。 Activex只需获取一个PDF文件,并对该PDF文件进行数字签名和临时存储,然后使用itextsharp库的PdfEncodings类将该PDF文件作为base64字符串返回。 为了使用Activex对象,我创建了两个asp.net隐藏字段,一个用于
PdfReader pdfReader = new PdfReader(PdfEncodings.ConvertToBytes(unsignedPDF, null));
string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".pdf";
FileStream signedPdf = new FileStream(fileName, FileMode.Create);
PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0');
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
if (sel.Count > 0)
{
X509Certificate2 cert = sel[0];
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 X509Certificate2Signature(cert, "SHA-1");
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
signatureAppearance.Reason = "I declare this document is legal";
signatureAppearance.Location = "Delhi";
signatureAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), pdfReader.NumberOfPages, "Signature");
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
return PdfEncodings.ConvertToString(File.ReadAllBytes(fileName), null);
}
else
{
return "ERROR";
}
从浏览器下载PDF的代码:
byte[] pdfByte = PdfEncodings.ConvertToBytes(signed.Value, null);
Response.Clear();
MemoryStream ms = new MemoryStream(pdfByte);
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=labtest.pdf");
Response.Buffer = true;
ms.WriteTo(Response.OutputStream);
Response.End();
Pdfencodings并不是为了这个目的,我只是使用了convert.tobase64string和convert.frombase64string,它就工作了。:)
PdfEncodings
类不是用于将任意二进制数据(并且完成的PDF是二进制数据)转换为某种字符串格式,而是用于一种或另一种编码中的字符数据。如果应用于二进制数据,此过程将引入错误。你应该改用base64编码器/解码器。谢谢,我解决了。是的,你说得对。Pdfencodings并不是为了这个,我只是使用convert.tobase64string和convert.frombase64string,它就工作了。