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);
}
}
}