using EasyBL.WebApi.Message; using System; using System.Diagnostics; using System.IO; using System.Text; namespace EasyBL { public class PdfService : ServiceBase { #region Excel轉Pdf /// /// 函式名稱:ExcelToPdf /// 函式說明:系統登入 /// /// todo: describe i_crm parameter on ExcelToPdf /// /// 回傳 rm(Object) /// public ResponseMessage ExcelToPdf(RequestMessage i_crm) { ResponseMessage rm = null; string sError = null; string sOutputPath = null; try { do { var sInputPath = _fetchString(i_crm, "InputPath"); var sOutputFolder = _fetchString(i_crm, "OutputFolder"); var sFileName = _fetchString(i_crm, "FileName"); var bOk = ExcelToPdf(out sOutputPath, sInputPath, sFileName, sOutputFolder); rm = new SuccessResponseMessage(null, i_crm); rm.DATA.Add(BLWording.REL, sOutputPath); } while (false); } catch (Exception ex) { sError = Util.GetLastExceptionMsg(ex); LogAndSendEmail(sError + "Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(PdfService), nameof(ExcelToPdf), "ExcelToPdf(Excel 轉PDF)", "", "", ""); } finally { if (null != sError) { rm = new ErrorResponseMessage(sError, i_crm); } } return rm; } #endregion Excel轉Pdf public static string HtmlToPdf(string sHtml, string sFileName, string outputFolder) { var sRoot = System.Web.HttpContext.Current.Server.MapPath("/EurotranFile"); Common.FnCreateDir(sRoot + "\\" + outputFolder);//如果沒有該目錄就創建目錄 var sOutputPath = sRoot + "\\" + outputFolder + "\\" + sFileName; var sHtmlPath = sOutputPath + ".html"; var sPdfPath = sOutputPath + ".pdf"; var sContent = System.Web.HttpContext.Current.Server.HtmlDecode(sHtml); if (File.Exists(sHtmlPath)) { File.Delete(sHtmlPath); } using (FileStream fs = new FileStream(sHtmlPath, FileMode.Create)) { using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8)) { w.WriteLine(sContent); } } try { if (!string.IsNullOrEmpty(sHtmlPath) || !string.IsNullOrEmpty(sPdfPath)) { var resource = sRoot + "\\Resoure"; var dllstr = string.Format(resource + "\\wkhtmltopdf.exe"); if (File.Exists(dllstr)) { var strParam = sHtmlPath + " " + sPdfPath; var pInfo = new ProcessStartInfo { FileName = dllstr, Arguments = strParam.ToString(), UseShellExecute = false, RedirectStandardOutput = true, //pInfo.RedirectStandardError = true; RedirectStandardInput = true, CreateNoWindow = false }; using (var p = new Process { StartInfo = pInfo }) { p.Start(); p.WaitForExit(); try { if (!p.HasExited) { p.Kill(); } } catch { } } } } File.Delete(sHtmlPath);//刪除html文件 } catch (Exception ex) { throw new Exception(ex.ToString()); } return sPdfPath.Replace("\\", "/"); } public static bool ExcelToPdf(out string outputPath, string inputPath, string sFileName = null, string sTempFolder = null) { if (string.IsNullOrEmpty(sFileName)) { sFileName = Guid.NewGuid().ToString(); } if (string.IsNullOrEmpty(sTempFolder)) { sTempFolder = "Temp"; } var bOk = false; var sRoot = System.Web.HttpContext.Current.Server.MapPath("/EurotranFile"); Common.FnCreateDir(sRoot + "\\" + sTempFolder);//如果沒有該目錄就創建目錄 var sOutputPath = sRoot + "\\" + sTempFolder + "\\" + sFileName; var sPdfPath = sOutputPath + ".pdf"; try { //Spire.Xls.Workbook xls = new Spire.Xls.Workbook(); //xls.ConverterSetting.SheetFitToPage = true; //xls.LoadFromFile(inputPath, Spire.Xls.ExcelVersion.Version97to2003); //xls.SaveToFile(sPdfPath, Spire.Xls.FileFormat.PDF); //bOk = true; } catch (Exception ex) { throw new Exception(ex.ToString()); } outputPath = sPdfPath.Replace("\\", "/"); return bOk; } public static bool DelFile(string sPath) { var blRet = false; try { if (sPath.StartsWith("Document") || sPath.StartsWith("OutFiles")) { sPath = System.Web.HttpContext.Current.Server.MapPath("/" + sPath); } if (File.Exists(sPath)) { File.Delete(sPath); blRet = true; } } catch { blRet = false; } return blRet; } //字符串转流 public static MemoryStream StringToStream(string s) { // convert string to stream var byteArray = Encoding.Default.GetBytes(s); var stream = new MemoryStream(byteArray); return stream; } //流转字符串 public static string StreamToString(Stream stream) { using (var reader = new StreamReader(stream)) { var text = reader.ReadToEnd(); return text; } } //字符串转字节数组 public static Byte[] StringToByteArray(string s) { return Encoding.Default.GetBytes(s); } //字节数组转字符串 public static string ByteArrayToString(Byte[] bytes) { return Encoding.Default.GetString(bytes); } } }