using Sugar.Enties; using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using ServiceReference1; using System.Data; using System.IO; using iTextSharp.text.pdf; using WebAPIBase.Utils; using iTextSharp.text; using Sugar; using SqlSugar; /// /// 流程审核生成pdf帮助类 /// public class WorkFlowPDFHelper { private static string webserviceUrl = "http://127.0.0.1/WorkFlowWebService60NodeJS/query.asmx"; private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// pdf文件存放路径 /// public static string pdfDirectory { get { return RequestHelper.IsRemote ? AppSettingsHelper.Configuration["ServiceVirtualPath:RealPath"] : AppSettingsHelper.Configuration["LocalVirtualPath:RealPath"]; } } /// /// 创建webservice实例 /// /// public static QuerySoap Services() { //创建 HTTP 绑定对象 var binding = new BasicHttpBinding(); binding.SendTimeout = new TimeSpan(0, 5, 0); binding.ReceiveTimeout = new TimeSpan(0, 5, 0); //根据 WebService 的 URL 构建终端点对象,参数是提供的WebService地址 var endpoint = new EndpointAddress(webserviceUrl); //创建调用接口的工厂,注意这里泛型只能传入接口 泛型接口里面的参数是WebService里面定义的类名+Soap var factory = new ChannelFactory(binding, endpoint); //从工厂获取具体的调用实例 var callClient = factory.CreateChannel(); return callClient; } /// /// 判断pdf文件夹是否存在 /// /// public static string CheckServerPdfFolder() { string WebServiceUrl = new ConfigItemValueManager().GetConfigItemValue("基础模块-流程管理-流程审批WebService地址"); if (WebServiceUrl != "") { if (Services().PdfFileFolderCheck()) { return WebServiceUrl; } else return ""; } return ""; } /// /// 检查pdf文件是否能存在 /// /// /// public static bool CheckServerPdfFileExists(string filename) { string WebServiceUrl = CheckServerPdfFolder(); if (WebServiceUrl != "") { return Services().PdfFileExistsCheck(filename); } return false; } /// /// 建立pdf文件 /// /// /// public static void CreatePDFForm(DataSet ds, string fileName) { FileStream fs = null; try { #region --生成pdf文件-- if (ds == null) { return; } //新建文件,大小尺寸 //iTextSharp.text.Rectangle singleFormSize = new iTextSharp.text.Rectangle(166.32F, 350.64F); int maxColumnNum = 0; for (int i = 1; i < ds.Tables.Count; i++) { if (maxColumnNum < ds.Tables[i].Columns.Count) maxColumnNum = ds.Tables[i].Columns.Count; } iTextSharp.text.Document doc = new iTextSharp.text.Document(); doc.SetMargins(5f, 5f, 5f, 5f); if (maxColumnNum > 5) { doc.SetPageSize(iTextSharp.text.PageSize.A4); } else { doc.SetPageSize(iTextSharp.text.PageSize.A6); } #region --字体-- iTextSharp.text.pdf.BaseFont bfChinese = iTextSharp.text.pdf.BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1", iTextSharp.text.pdf.BaseFont.IDENTITY_H, iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED); //iTextSharp.text.Font fontChinese = new iTextSharp.text.Font(bfChinese, 12, iTextSharp.text.Font.NORMAL, iTextSharp.text.Color.BLACK); //主表表单字体 iTextSharp.text.Font fontChinese = new iTextSharp.text.Font(bfChinese, 12, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.Black); //明细表字体 iTextSharp.text.Font fontDetail = new iTextSharp.text.Font(bfChinese, 10, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.Black); #endregion //保存文件 if (!Directory.Exists(pdfDirectory)) { Directory.CreateDirectory(pdfDirectory); } string filePath = $"{pdfDirectory}\\{fileName}.pdf"; logger.Info($"【CreatePDFForm】filePath:{filePath}"); fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); fs.SetLength(0); /* if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); } fs = new FileStream(filePath, FileMode.Create); * */ PdfWriter writer = PdfWriter.GetInstance(doc, fs); //打开文件 doc.Open(); #region --画表格-- if (ds.Tables.Count > 0) { iTextSharp.text.Paragraph pTitle = new iTextSharp.text.Paragraph(new iTextSharp.text.Chunk(ds.DataSetName, fontChinese)); pTitle.SetAlignment("center"); doc.Add(pTitle); #region --主表-- DataTable dtMain = ds.Tables[0]; //主表样式 iTextSharp.text.Table tblMain = new iTextSharp.text.Table(2); tblMain.BorderWidth = 1; tblMain.BorderColor = new iTextSharp.text.BaseColor(0, 0, 0); tblMain.Cellpadding = 1; tblMain.Cellspacing = 1; tblMain.Width = 100; tblMain.SetWidths(new int[] { 35, 65 }); //主表内容 foreach (DataColumn cc in dtMain.Columns) { string[] cellTitle = cc.ColumnName.Split('$'); tblMain.AddCell(new iTextSharp.text.Cell(new iTextSharp.text.Phrase(cellTitle[0], fontChinese))); iTextSharp.text.Cell cellValue = new iTextSharp.text.Cell(new iTextSharp.text.Phrase(dtMain.Rows[0][cc.ColumnName].SConvertString(), fontChinese)); if (cellTitle.Length > 1) { cellValue.Colspan = Convert.ToInt16(cellTitle[1]); } tblMain.AddCell(cellValue); } //写入文件 doc.Add(tblMain); #endregion #region --明细表-- for (int i = 1; i < ds.Tables.Count; i++) { DataTable dtDetail = ds.Tables[i]; //明细表名称 doc.Add(new iTextSharp.text.Paragraph(dtDetail.TableName, fontChinese)); //明细表样式 iTextSharp.text.Table tblDetail = new iTextSharp.text.Table(dtDetail.Columns.Count); tblDetail.BorderWidth = 1; tblDetail.BorderColor = new iTextSharp.text.BaseColor(0, 0, 0); tblDetail.Cellpadding = 1; tblDetail.Cellspacing = 1; tblDetail.Width = 100; //表头 foreach (DataColumn cc in dtDetail.Columns) { tblDetail.AddCell(new iTextSharp.text.Cell(new iTextSharp.text.Phrase(cc.ColumnName, fontDetail))); } //数据行 foreach (DataRow dr in dtDetail.Rows) { foreach (DataColumn cc in dtDetail.Columns) { iTextSharp.text.Cell cellValue = new iTextSharp.text.Cell(new iTextSharp.text.Phrase(dr[cc.ColumnName].SConvertString(), fontDetail)); cellValue.SetHorizontalAlignment("right"); cellValue.SetVerticalAlignment("bottom"); tblDetail.AddCell(cellValue); } } //写入文件 doc.Add(tblDetail); } #endregion } else { doc.Add(new iTextSharp.text.Paragraph("对不起,没有取到数据", fontChinese)); } #endregion //关闭文件 doc.Close(); writer.Close(); fs.Close(); fs.Dispose(); #endregion string WebServiceUrl = CheckServerPdfFolder(); if (WebServiceUrl != "") { //将pdf 文件写入database WorkFlowPDFFileService pdffileService = new WorkFlowPDFFileService(); pdffileService.Save("WorkFlowCase", fileName, ""); //将database中的pdf文件写入webservice服务器 异步调用接口 logger.Info($"【复制文件到服务器 PdfFileCopy】fileName:{fileName}"); Services().PdfFileCopyAsync(fileName, "WorkFlowCase"); //logger.Info($"【复制文件到服务器 PdfFileCopy】copy:{copy}"); //处理附件 new WorkFlowAttachRule().ConvertFileToAttachment(fileName, WebServiceUrl); } } catch (Exception ex) { //logger.Error(ex); throw new ApplicationException("CreatePDFForm错误:" + ex.Message); } } /// /// 删除pdf文件 /// /// public static void DeleteFile(string fileName) { try { string filePath = $"{pdfDirectory}\\{fileName}.pdf"; if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); } //在database中标记要删除的pdf文件 WorkFlowPDFFileService pdffileService = new WorkFlowPDFFileService(); pdffileService.MarkDelete("WorkFlowCase", fileName); //删除服务器上的pdf文件,删除database中的pdf文件记录 string WebServiceUrl = CheckServerPdfFolder(); if (WebServiceUrl != "") { Services().PdfFileRemoveAsync(fileName, "WorkFlowCase"); Services().PdfFileRemoveAsync(fileName, "CaseCode"); } } catch (Exception ex) { throw new ApplicationException("WorkFlowPDFHelper-DeleteFile错误:" + ex.Message); } } /// /// 填充dt主表单 /// /// /// /// public static void FillMainFormData(DataTable dt, string columnCaption, string rowValue) { dt.Columns.Add(columnCaption); if (dt.Rows.Count == 0) { dt.Rows.Add(dt.NewRow()); } dt.Rows[0][columnCaption] = rowValue; } } public class WorkFlowAttachRule : WorkFlowProcedureManager { NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public WorkFlowAttachRule() { // // TODO: 在此处添加构造函数逻辑 // } public static bool CheckServerPdfFolder(string casecode) { string WebServiceUrl = WorkFlowPDFHelper.CheckServerPdfFolder(); if (WebServiceUrl != "") { if (WorkFlowPDFHelper.Services().AttachFileExistsCheck(casecode)) return true; } return false; } /// /// 把附件存在数据库中 /// /// /// public void ConvertFileToAttachment(string casecode, string WebServiceUrl) { try { //todo:删除服务器上的附件文件 // ../workflow/@casecode/ WorkFlowPDFHelper.Services().PdfFileRemoveAsync(casecode, "CaseCode"); //清空workflowpdffile string sqlDelete = $"delete from workflowpdffile where attachmenttype='WorkFlowActOpinion'and CaseCode='{casecode}'"; logger.Info($"【ConvertFileToAttachment】sqlDelete:{sqlDelete}"); Db.Ado.ExecuteCommand(sqlDelete); //从附件表attachment中写入附件到workflowpdffile string sqlAllAttachment = $@"select * from attachment where attachmenttype='WorkFlowActOpinion' and MasterCode in (select ApplicationCode from WorkFlowOpinion where CaseCode='{casecode}') and (right(filename,4) in('.doc','.xls','.ppt','.pdf','.log','.txt','.htm','.mp3','.mp4','.jpg','.gif','.png','.bmp') or right(filename,5) in('.docx','.xlsx','.pptx','.html','.jgep','.jpeg'))"; logger.Info($"【ConvertFileToAttachment】sqlAllAttachment:{sqlAllAttachment}"); DataTable dtAttachment = Db.Ado.GetDataTable(sqlAllAttachment); logger.Info($"【ConvertFileToAttachment】dtAttachment.count:{dtAttachment.Rows.Count}"); if (dtAttachment.Rows.Count > 0) { WorkFlowPDFFileService pdfService = new WorkFlowPDFFileService(); foreach (DataRow dr in dtAttachment.Rows) { //写入文件 pdfService.SaveAttachment(dr, casecode); } } //业务单据的附件 string sqlFormAttachment = $@"select at.* from attachment at inner join( select b.AttachmentType,a.ApplicationCode,a.casecode from WorkFlowCase a inner join WorkFlowAttachmentType b on a.ApplicationPath=b.ApplicationPath where a.CaseCode='{casecode}' ) as wk on at.AttachmentType=wk.AttachmentType and at.MasterCode=wk.ApplicationCode where (right(filename,4) in('.doc','.xls','.ppt','.pdf','.log','.txt','.htm','.mp3','.mp4','.jpg','.gif','.png','.bmp') or right(filename,5) in('.docx','.xlsx','.pptx','.html','.jgep','.jpeg'))"; logger.Info($"【ConvertFileToAttachment】sqlFormAttachment:{sqlFormAttachment}"); DataTable dtFormAttachment = Db.Ado.GetDataTable(sqlFormAttachment); if (dtFormAttachment.Rows.Count > 0) { WorkFlowPDFFileService pdfService = new WorkFlowPDFFileService(); foreach (DataRow dr in dtFormAttachment.Rows) { //写入文件 pdfService.SaveAttachment(dr, casecode); } } //复制文件 WorkFlowPDFHelper.Services().PdfFileCopyAsync(casecode, "CaseCode"); } catch (Exception ex) { throw new ApplicationException("WorkFlowPDFHelper-ConvertFileToAttachment错误:" + ex.Message); } } } #region --WorkFlowPDFFileService /// /// /// public class WorkFlowPDFFileService : WorkFlowProcedureManager { NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public WorkFlowPDFFileService() { // // TODO: 在此处添加构造函数逻辑 // } public DataTable GetByMasterCodeAttachmentType(string attachmenttype, string mastercode) { try { string sql = $"select * from WorkFlowPDFFile where attachmenttype='{attachmenttype}' and mastercode='{mastercode}'"; ; DataTable dt = Db.Ado.GetDataTable(sql); return dt; } catch (Exception ex) { throw new ApplicationException("WorkFlowPDFHelper-GetByMasterCodeAttachmentType错误:" + ex.Message); } } /// /// 保存流程表单pdf文件 /// /// /// /// public void Save(string attachmenttype, string mastercode, string usercode) { try { string filename = string.Format("{0}.pdf", mastercode); string fullname = $"{WorkFlowPDFHelper.pdfDirectory}\\{filename}"; FileInfo fi = new FileInfo(fullname); if (fi.Exists) { byte[] content = new byte[fi.Length]; FileStream fs = fi.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Read(content, 0, (int)fi.Length); fs.Close(); fs.Dispose(); string sql = $"select 1 from WorkFlowPDFFile where attachmenttype='{attachmenttype}' and mastercode='{mastercode}'"; if (Db.Ado.GetString(sql).IsNotNullAndEmpty()) { //删除旧pdf文件记录 Db.Ado.ExecuteCommand($"delete from WorkFlowPDFFile where attachmenttype='{attachmenttype}' and mastercode='{mastercode}'"); } var pdfFile = new WorkFlowPDFFile(); pdfFile.AttachMentType = attachmenttype; pdfFile.MasterCode = mastercode; pdfFile.Content_Type = "application/pdf"; pdfFile.Length = (int)fi.Length; pdfFile.FileName = filename; pdfFile.CreatePerson = ""; pdfFile.CreateDate = DateTime.Now; pdfFile.Content = content; logger.Info($"【保存pdf附件】attachmenttype:{attachmenttype},mastercode:{mastercode}"); var row = Db.Insertable(pdfFile).ExecuteCommand(); logger.Info($"【保存pdf附件】执行成功row:{row}"); } } catch (Exception ex) { throw new ApplicationException("WorkFlowPDFHelper-Save错误:" + ex.Message); } } public void MarkDelete(string attachmenttype, string mastercode) { try { string sql = @"update WorkFlowPDFFile set attachmenttype='---'+attachmenttype where (attachmenttype='{attachmenttype}' and mastercode='{mastercode}') or (attachmenttype='WorkFlowActOpinion'and CaseCode='{mastercode}')"; Db.Ado.ExecuteCommand(sql); } catch (Exception ex) { throw new ApplicationException("WorkFlowPDFHelper-MarkDelete错误:" + ex.Message); } } /// /// 保存流程附件文件 /// /// /// public void SaveAttachment(DataRow dr, string casecode) { try { var entity = new WorkFlowPDFFile(); entity.AttachMentType = dr["attachmenttype"].SConvertString(); entity.MasterCode = dr["mastercode"].SConvertString(); entity.FileName = dr["filename"].SConvertString(); entity.Content_Type = dr["content_type"].SConvertString(); entity.CreatePerson = dr["createperson"].SConvertString(); entity.CaseCode = casecode; bool isAdd = true; if (dr["Content"] != DBNull.Value) { entity.Content = (byte[])dr["Content"]; entity.Length = dr["length"].ToInteger(); } else { //存文件的 string guidname = ConvertRule.ToString(dr["GuidName"]); string fullname = GetFileName(guidname, ConvertRule.ToDateString(dr["CreateDate"])); FileInfo fi = new FileInfo(fullname); if (fi.Exists) { byte[] content = new byte[fi.Length]; FileStream fs = fi.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Read(content, 0, (int)fi.Length); entity.Content = content; entity.Length = (int)fi.Length; fs.Close(); fs.Dispose(); } else { isAdd = !isAdd; } } if (isAdd) { Db.Insertable(entity).ExecuteCommand(); } } catch (Exception ex) { throw new ApplicationException("WorkFlowPDFHelper-SaveAttachment错误:" + ex.Message); } } #region--private方法-- /// /// 替换文件名中的非法字符为同样式的其他字符 /// /// /// private static string ReplaceFileName(string name) { name = name.Replace("/", "/"); name = name.Replace("\\", "\"); name = name.Replace(":", ":"); name = name.Replace("*", "※"); name = name.Replace("?", "?"); name = name.Replace("\"", "“"); name = name.Replace("<", "<"); name = name.Replace(">", ">"); name = name.Replace("|", "│"); return name; } private string GetPath(string date) { new DocumentRule().Init(); string fullname; string _Path = new ConfigItemValueManager().GetConfigItemValue("基础模块-附件存储设置-文件存储目录").ToLower(); switch (DocumentRule._SavePathMode) { case AttachmentSavePathMode.ROOT: fullname = _Path; break; case AttachmentSavePathMode.YYYY: fullname = Path.Combine(_Path, GetYearString(date)); break; case AttachmentSavePathMode.YYYYMM: fullname = Path.Combine(_Path, GetYearMonthString(date)); break; case AttachmentSavePathMode.YYYYMMDD: fullname = Path.Combine(_Path, GetYearMonthDateString(date)); break; default: fullname = _Path; break; } return fullname; } private string GetFileName(string filename, string date) { return Path.Combine(GetPath(date), filename); } private static string GetYearString(string date) { DateTime dt = new DateTime(); if (date == string.Empty) return string.Empty; if (DateTime.TryParse(date, out dt)) { return dt.Year.ToString(); } else { return string.Empty; } } private static string GetYearMonthString(string date) { DateTime dt = new DateTime(); if (date == string.Empty) return string.Empty; if (DateTime.TryParse(date, out dt)) { return dt.Year.ToString() + dt.Month.ToString().PadLeft(2, '0'); } else { return string.Empty; } } private static string GetYearMonthDateString(string date) { DateTime dt = new DateTime(); if (date == string.Empty) return string.Empty; if (DateTime.TryParse(date, out dt)) { return dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString().PadLeft(2, '0'); } else { return string.Empty; } } #endregion } #endregion