using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Net; using System.Text; namespace Edu.Common.Plugin { /// <summary> /// 公共帮助类 /// </summary> public class ToPdfHelper { /// <summary> /// HtmlWJtoPdf /// </summary> /// <param name="path"></param> /// <param name="url"></param> /// <param name="noMargin"></param> /// <param name="wkhtmltopdfConfig">工具路径</param> /// <param name="headerHtmlPath">HeaderHTML路劲</param> /// <param name="footerHtmlPath">HeaderHTML路劲</param> /// <returns></returns> public bool HtmlWJtoPdf(string path, string url, int noMargin = 0, string wkhtmltopdfConfig = "", string headerHtmlPath = "", string footerHtmlPath = "") { try { HtmlConvertToPdf(url, path, noMargin, wkhtmltopdfConfig, headerHtmlPath, footerHtmlPath); return true; } catch (Exception) { return false; } } /// <summary> /// HTML转换为PDF /// </summary> /// <param name="htmlPath">可以是本地路径,也可以是网络地址</param> /// <param name="savePath">PDF文件保存的路径</param> /// <param name="noMargin">PDF文件保存的路径</param> /// <param name="wkhtmltopdfConfig">工具路径</param> /// <param name="headerHtmlPath">headerHtml路劲</param> /// <param name="footerHtmlPath">footerHtml路劲</param> /// <returns></returns> public bool HtmlConvertToPdf(string htmlPath, string savePath, int noMargin, string wkhtmltopdfConfig = "", string headerHtmlPath = "", string footerHtmlPath = "") { bool flag = false; CheckFilePath(savePath); //这个路径为程序集的目录,因为我把应用程序 wkhtmltopdf.exe 放在了程序集同一个目录下 string exePath = string.Empty; if (wkhtmltopdfConfig == "") { exePath = Config.wkhtmltopdfConfig + "wkhtmltopdf.exe "; } else { exePath = wkhtmltopdfConfig + "wkhtmltopdf.exe "; } if (!File.Exists(exePath)) { throw new Exception("No application wkhtmltopdf.exe was found."); } try { ProcessStartInfo processStartInfo = new ProcessStartInfo { FileName = exePath, WorkingDirectory = Path.GetDirectoryName(exePath), UseShellExecute = false, CreateNoWindow = true, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, Arguments = GetArguments(htmlPath, savePath, noMargin, headerHtmlPath, footerHtmlPath) }; Process process = new Process { StartInfo = processStartInfo }; process.Start(); process.WaitForExit(6000); //用于查看是否返回错误信息 StreamReader srone = process.StandardError; string ss1 = srone.ReadToEnd(); srone.Close(); srone.Dispose(); process.Close(); process.Dispose(); flag = true; } catch (Exception ex) { LogHelper.Write(ex, "HtmlConvertToPdf"); flag = false; } return flag; } /// <summary> /// 获取命令行参数 /// </summary> /// <param name="htmlPath"></param> /// <param name="savePath"></param> /// <param name="noMargin"></param> /// <param name="headerHtmlPath">headerHTML路劲</param> /// <param name="footerHtmlPath">footerHTML路劲</param> /// <returns></returns> private string GetArguments(string htmlPath, string savePath, int noMargin, string headerHtmlPath = "", string footerHtmlPath = "") { if (string.IsNullOrEmpty(htmlPath)) { throw new Exception("HTML local path or network address can not be empty."); } if (string.IsNullOrEmpty(savePath)) { throw new Exception("The path saved by the PDF document can not be empty."); } StringBuilder stringBuilder = new StringBuilder(); //stringBuilder.Append(" --page-height 100 "); //页面高度100mm //stringBuilder.Append(" --page-width 100 "); //页面宽度100mm //stringBuilder.Append(" --header-center 我是页眉 "); //设置居中显示页眉 //stringBuilder.Append(" --header-line "); //页眉和内容之间显示一条直线 if (headerHtmlPath != null && !string.IsNullOrEmpty(headerHtmlPath)) { //stringBuilder.Append(" --disable-smart-shrinking ");//禁止智能缩放 stringBuilder.Append(" --header-html " + headerHtmlPath + " "); } if (footerHtmlPath != null && !string.IsNullOrEmpty(footerHtmlPath)) { stringBuilder.Append(" --footer-html " + footerHtmlPath + " "); stringBuilder.Append(" --margin-left 5mm "); stringBuilder.Append(" --margin-right 5mm "); } //stringBuilder.Append(" --footer-left \"" + DateTime.Now.ToString("yyyy/MM/dd") + "\" "); //设置居中显示页脚 //stringBuilder.Append(" --footer-right \"[page]/[topage]\" "); //设置居中显示页脚 stringBuilder.Append(" --footer-font-size 7 "); stringBuilder.Append(" --footer-spacing 5 "); if (noMargin == 1) { stringBuilder.Append(" --margin-left 0"); stringBuilder.Append(" --margin-right 0"); stringBuilder.Append(" --margin-top 0"); stringBuilder.Append(" --margin-bottom 0"); } //stringBuilder.Append(" --footer-line "); //页脚和内容之间显示一条直线 stringBuilder.Append(" " + htmlPath + " "); //本地 HTML 的文件路径或网页 HTML 的URL地址 stringBuilder.Append(" " + savePath + " "); //生成的 PDF 文档的保存路径 return stringBuilder.ToString(); } /// <summary> /// 验证保存路径 /// </summary> /// <param name="savePath"></param> private void CheckFilePath(string savePath) { string ext = string.Empty; string path = string.Empty; string fileName = string.Empty; ext = Path.GetExtension(savePath); if (string.IsNullOrEmpty(ext) || ext.ToLower() != ".pdf") { throw new Exception("Extension error:This method is used to generate PDF files."); } fileName = Path.GetFileName(savePath); if (string.IsNullOrEmpty(fileName)) { throw new Exception("File name is empty."); } try { path = savePath.Substring(0, savePath.IndexOf(fileName)); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } catch { throw new Exception("The file path does not exist."); } } } }