-- enable-local-file-access允许将本地文件转换到其他本地文件中读取(默认设置) -- exc

时间:2022-02-07 07:49:57

之前也记录过一篇关于把 HTML 文本或 HTML 文件转换为 PDF 的博客,只是之前那种要领有些局限性。

后来又了解到 wkhtmltopdf.exe 这个工具,这个工具比起之前的那种要领的确是太好用了。
它是一个使用 Qt WebKit 引擎做衬着的,能够把 HTML 文档转换成 PDF 文档或图片(image) 的命令行工具。
撑持多个平台,可在 windows、linux 等系统下运行。
你可以从这里获取到它:https://wkhtmltopdf.org/downloads.html

二、安置

下载完成之后你需要先安置它,然后你就能获取到 wkhtmltopdf.exe 这个文件了,还包孕有一个 wkhtmltoimage.exe 文件,
第一个文件是把 HTML 文档转换为 PDF 文档的,后一个文件是把 HTML 文档转换为图片的(Image),使用要领类似,只是挪用的文件不一样而已,这里就不久不多做介绍。

我在安置完成之后把 wkhtmltopdf.exe 这个文件放到了措施集地址的目录,固然,你也可以不这么做,但是就需要改削相应的路径。

三、代码

下面不久不多说了,贴出我的代码。

   public partial class Form3 : Form { public Form3() { InitializeComponent(); string strHtml = "<p style=‘color:red;text-align:center;background-color:#000000;‘>Hello World!<p><div style=‘width:150px;height:150px;background-color:blue;‘></div>"; string htmlUrl = "https://wkhtmltopdf.org/downloads.html"; /// 把 HTML 文本内容转换为 PDF HtmlTextConvertToPdf(strHtml, @"C:\Users\Administrator\Desktop\001.pdf"); /// 把 HTML 文件转换为 PDF HtmlConvertToPdf(htmlUrl, @"C:\Users\Administrator\Desktop\002.pdf"); } /// <summary> /// HTML文本内容转换为PDF /// </summary> /// <param>HTML文本内容</param> /// <param>PDF文件生存的路径</param> /// <returns></returns> public bool HtmlTextConvertToPdf(string strHtml, string savePath) { bool flag = false; try { string htmlPath = HtmlTextConvertFile(strHtml); flag = HtmlConvertToPdf(htmlPath, savePath); File.Delete(htmlPath); } catch { flag = false; } return flag; } /// <summary> /// HTML转换为PDF /// </summary> /// <param>可以是本地路径,也可以是网络地点</param> /// <param>PDF文件生存的路径</param> /// <returns></returns> public bool HtmlConvertToPdf(string htmlPath, string savePath) { bool flag = false; CheckFilePath(savePath); ///这个路径为措施集的目录,因为我把应用措施 wkhtmltopdf.exe 放在了措施集同一个目录下 string exePath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "wkhtmltopdf.exe"; if (!File.Exists(exePath)) { throw new Exception("No application wkhtmltopdf.exe was found."); } try { ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.FileName = exePath; processStartInfo.WorkingDirectory = Path.GetDirectoryName(exePath); processStartInfo.UseShellExecute = false; processStartInfo.CreateNoWindow = true; processStartInfo.RedirectStandardInput = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.RedirectStandardError = true; processStartInfo.Arguments = GetArguments(htmlPath, savePath); Process process = new Process(); process.StartInfo = processStartInfo; process.Start(); process.WaitForExit(); ///用于检察是否返回错误信息 //StreamReader srone = process.StandardError; //StreamReader srtwo = process.StandardOutput; //string ss1 = srone.ReadToEnd(); //string ss2 = srtwo.ReadToEnd(); //srone.Close(); //srone.Dispose(); //srtwo.Close(); //srtwo.Dispose(); process.Close(); process.Dispose(); flag = true; } catch { flag = false; } return flag; } /// <summary> /// 获取命令行参数 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> private string GetArguments(string htmlPath,string savePath) { 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 "); //页眉和内容之间显示一条直线 stringBuilder.Append(" --footer-center \"Page [page] of [topage]\" "); //设置居中显示页脚 stringBuilder.Append(" --footer-line "); //页脚和内容之间显示一条直线 stringBuilder.Append(" " + htmlPath + " "); //本地 HTML 的文件路径或网页 HTML 的URL地点 stringBuilder.Append(" " + savePath + " "); //生成的 PDF 文档的生存路径 return stringBuilder.ToString(); } /// <summary> /// 验证生存路径 /// </summary> /// <param></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."); } } /// <summary> /// HTML文本内容转HTML文件 /// </summary> /// <param>HTML文本内容</param> /// <returns>HTML文件的路径</returns> public string HtmlTextConvertFile(string strHtml) { if (string.IsNullOrEmpty(strHtml)) { throw new Exception("HTML text content cannot be empty."); } try { string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + @"html\"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string fileName = path + DateTime.Now.ToString("yyyyMMddHHmmssfff") + new Random().Next(1000, 10000) + ".html"; FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.Default); streamWriter.Write(strHtml); streamWriter.Flush(); streamWriter.Close(); streamWriter.Dispose(); fileStream.Close(); fileStream.Dispose(); return fileName; } catch { throw new Exception("HTML text content error."); } } }