using System; using System.Collections.Generic; using System.Linq; using System.Web; using Netca_PDFSign_COM; using System.IO; using System.Drawing; using Spire.Pdf; using System.Text; using Spire.Pdf.Graphics; namespace EmisTerminal { public class PDFSign { public const string PDFPath = "~/Content/PrintFile"; public static string PDFAbsolutePath { get { return HttpContext.Current.Server.MapPath(PDFPath); } } static PDFSign() { if (!Directory.Exists(PDFAbsolutePath)) { Directory.CreateDirectory(PDFAbsolutePath); } } private byte[] GetImage(string certEncoded) { if (!string.IsNullOrEmpty(certEncoded)) { IUtilTool util = new UtilTool(); byte[] imgBytes = util.GetImageFromDevicByCert(certEncoded); if (imgBytes == null) { throw new Exception("找不到可用的签章图片!"); } return imgBytes; } else { throw new Exception("找不到可用的外观,请确定已连接设备!"); } } public string Sign(string targetFileName, Stream pageStream) { var pageBytes = new byte[pageStream.Length]; var monthString = DateTime.Today.ToString("yyyy-MM"); var monthPath = PDFAbsolutePath + @"\" + monthString; if (!Directory.Exists(monthPath)) { Directory.CreateDirectory(monthPath); } var destFileName = ""; var printTimes = Directory.GetFiles(monthPath).Where(x => x.Contains(targetFileName)).ToArray(); if (printTimes.Length > 0) { destFileName = targetFileName + "(" + (printTimes.Length).ToString() + ").pdf"; } else { destFileName = targetFileName + ".pdf"; } var destFilePath = monthPath + @"\" + destFileName; pageStream.Read(pageBytes, 0, pageBytes.Length); ISignatureCreator creator = new SignatureCreator(); var certEncoded = creator.SelectCert(null, 0); creator.SetSignPDFBytes(pageBytes, null); var pageCount = creator.GetPagesCount(); var imgBytes = this.GetImage(certEncoded); MemoryStream ms = new MemoryStream(imgBytes); Image image = Image.FromStream(ms); PdfDocument pdf = new PdfDocument(pageStream); creator.SetSignCert(certEncoded, "sha-256", Const.NATCA_PASSWORD); for (int i = 1; i <= pageCount; i++) { try { var position = pdf.Pages[i - 1].FindAllText().Finds.OrderByDescending(x => x.Bounds.Bottom).First().Bounds; creator.SealPosition(destFilePath, i, Convert.ToInt32(Math.Floor(position.X - 20)), Convert.ToInt32(Math.Floor(position.Y - 99)), 119, 119, null, Convert.ToBase64String(imgBytes)); } catch (Exception) { } } var destPath = PDFPath + "/" + monthString + "/" + destFileName; return destPath; } } }