C# 使用 wkhtmltopdf 将HTML文本或文件转换为PDF
一、简介
最近遇到一个需求, 要求将某个页面导出成pdf文件,刚开始为了响应速度, 选择使用客户端导出,也找到了一些jquery包, 但是效果不是那么理想,无奈只能试着找服务器端导出,于是了解到 wkhtmltopdf.exe
这个工具,这个工具比起之前的那种方法简直是太好用了。
它是一个使用 Qt WebKit 引擎做渲染的,能够把 HTML 文档转换成 PDF 文档或图片(image) 的命令行工具,且要还支持网页的js代码和css代码的渲染,简直不能在爽了,并且支持多个平台,可在 windows、linux 等系统下运行。
官网:https://wkhtmltopdf.org/downloads.html
二、安装
下载完成之后你需要先安装它,然后你就能获取到 wkhtmltopdf.exe
这个文件了,还包括有一个 wkhtmltoimage.exe
文件,第一个文件是把 HTML 文档转换为 PDF 文档的,后一个文件是把 HTML 文档转换为图片的(Image),使用方法类似,只是调用的文件不一样而已,这里就不多做介绍。
我在安装完成之后可以把 wkhtmltopdf.exe 这个文件放到了程序集所在的目录,当然,你也可以不这么做,但是就需要修改相应的路径
三、Demo源码下载
Demo下载地址:https://pan.baidu.com/s/1IrTd1T4Jzv08qAyK1Q44ow
提取码:p5fp
四、代码实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;namespace Demo
{/// <summary>/// 网页或html代码转换类/// </summary>public class HtmlConvert{/// <summary>/// HTML文本内容转换为PDF/// </summary>/// <param name="strHtml">HTML文本内容</param>/// <param name="savePath">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 name="htmlPath">可以是本地路径,也可以是网络地址</param>/// <param name="savePath">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/wkhtmltopdf.exe";if (!File.Exists(exePath)){throw new Exception("没有找到wkhtmltopdf.exe应用程序");}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 name="htmlPath">html路径,可以是本地路径,也可以是网络地址</param>/// <param name="savePath">PDF文件保存的路径</param>/// <returns></returns>private string GetArguments(string htmlPath, string savePath){if (string.IsNullOrEmpty(htmlPath)){throw new Exception("HTML本地路径或网络地址不能为空.");}if (string.IsNullOrEmpty(savePath)){throw new Exception("PDF文档保存的路径不能为空.");}StringBuilder stringBuilder = new StringBuilder();stringBuilder.Append(" --page-height 200 "); //页面高度100mmstringBuilder.Append(" --page-width 250 "); //页面宽度100mmstringBuilder.Append(" --header-center 我是页眉(www.51baidu.com.cn) "); //设置居中显示页眉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 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("此方法用于生成PDF文件.");}fileName = Path.GetFileName(savePath);if (string.IsNullOrEmpty(fileName)){throw new Exception("文件名为空.");}try{path = savePath.Substring(0, savePath.IndexOf(fileName));if (!Directory.Exists(path)){Directory.CreateDirectory(path);}}catch{throw new Exception("文件路径不存在.");}}/// <summary>/// HTML文本内容转HTML文件/// </summary>/// <param name="strHtml">HTML文本内容</param>/// <returns>HTML文件的路径</returns>public string HtmlTextConvertFile(string strHtml){if (string.IsNullOrEmpty(strHtml)){throw new Exception("HTML文本内容不能为空.");}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文本内容错误.");}}}
}
调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Demo
{class Program{/// <summary>/// 白码驿站 (www.51baidu.com.cn)/// </summary>/// <param name="args"></param>static void Main(string[] args){string strHtml = @"<p style='color:red;text-align:center;background-color:#000000;'>Hello World!<p>";string htmlUrl = "https://www.51baidu.com.cn";HtmlConvert convert = new HtmlConvert();//把 HTML 文本内容转换为 PDFconvert.HtmlTextConvertToPdf(strHtml, AppDomain.CurrentDomain.BaseDirectory.ToString() + @"File/strHtml.pdf");//把 HTML 文件转换为 PDFconvert.HtmlConvertToPdf(htmlUrl, AppDomain.CurrentDomain.BaseDirectory.ToString() + @"File/htmlUrl.pdf");}}
}
五、命令行参数
全局选项:
--collate 打印多个副本时进行检查(默认设置)
--no-collate 打印多个副本时不进行检查
--cookie-jar <path> 从指定的cookie JAR文件中读写 cookie 数据
--copies <number> 打印 PDF 文件的份数(默认值为:1)
--dpi <dpi> 设置一个分辨率,对于 X11 系统没有作用(默认值为:96)
--extended-help 相对 -H 参数的设置,显示更详细的说明文档
--grayscale 将生成灰度的 PDF 文档,占用空间小,但是不会有彩色
--help 显示帮助信息
--htmldoc 输出程序的 HTML 帮助文档
--image-dpi <integer> 当页面存在内嵌图片时,指定图像的分辨率(默认值为:600)
--image-quality <interger> 当使用 JPEG 算法压缩图片时,指定图像的质量(默认值为:94)
--license 输出授权许可信息并退出
--lowquality 生成低质量的 PDF/PS,能够减少最终生成文档所占用的存储空间
--manpage 输出程序的手册页
--quiet 静默模式,不输出任何信息
--read-args-from-stdin 从标准输入读取命令行参数
--readme 输出程序的 Readme 文档
--version 输出版本信息并退出
--no-pdf-compression 设置为不要对 PDF 对象使用无损压缩
--margin-bottom <unitreal> 设置页面的底边距,单位毫米(mm)
--margin-left <unitreal> 设置页面的左边距 (默认值为:10mm)
--margin-right <unitreal> 设置页面的右边距 (默认值为:10mm)
--margin-top <unitreal> 设置页面的上边距,单位毫米(mm)
--page-size <Size> 设置页面的大小,如:A4、Letter等(默认值为:A4)
--page-height <unitreal> 设置页面高度,单位毫米(mm)
--page-width <unitreal> 设置页面宽度,单位毫米(mm)
--orientation <orientation> 设置文档模式为风景或肖像(默认值为:肖像)
--title <text> 生成的 PDF 文档的标题(如果没有指定,则使用第一个文档的标题)大纲选项:
--dump-default-toc-xsl 转储到默认的 TOC xsl 样式表到标准输出文件
--dump-outline <file> 将大纲转储到指定的文件(XML 文件)
--outline 在生成的 PDF 文档中添加大纲(默认设置)
--no-outline 不要在生成的 PDF 文档中添加大纲
--outline-depth <level> 设置大纲的深度(默认值为:4)页面选项:
--allow <path> 允许加载指定文件夹中的文件(可重复使用此参数指定多个文件)
--background 输出页面背景到 PDF 文档(默认设置)
--no-background 不输出页面背景到 PDF 文档
--bypass-proxy-for <value> 设置主机的代理(可重复指定多个代理)
--cache-dir <path> Web缓存目录
--checkbox-checked-svg <path> 使用指定的SVG文件渲染选中的复选框
--checkbox-svg <path> 使用指定的SVG文件渲染未选中的复选框
--cookie <name> <value> 设置访问网页时额外的 cookie,value 应该是 url 编码的(可重复使用此参数指定多个 cookie)
--custom-header <name> <value> 设置访问网页时额外的 HTTP 头(可重复使用此参数指定多个 HTTP 头)
--custom-header-propagation 为每个资源请求添加自定义的 HTTP 头
--no-custom-header-propagation 不要为每个资源请求添加自定义的 HTTP 头
--debug-javascript 显示 JavaScript 调试输出的内容
--no-debug-javascript 不显示 JavaScript 调试输出的内容(默认设置)
--encoding <encoding> 设置输入文本的默认编码
--disable-external-links 禁止页面中的外链生成超链接
--enable-external-links 允许页面中的外链生成超链接(默认设置)
--disable-forms 不要将 HTML 表单转换为 PDF 表单(默认设置)
--enable-forms 将 HTML 表单转换为 PDF 表单
--images 加载图片并输出到 PDF 文档(默认设置)
--no-images 在生成的 PDF 文档中过滤掉图片
--disable-internal-links 禁止页面中的内链生成超链接
--enable-internal-links 允许页面中的内链生成超连接(默认设置)
--disable-javascript 禁止 Web 页面运行 JavaScript
--enable-javascript 允许 Web 页面运行 JavaScript(默认设置)
--javascript-delay <msec> 延迟指定的时间,等待 JavaScript 执行完成,单位毫秒(ms)(默认值为:200)
--load-error-handling <handler> 指定如何处理无法加载的页面:abort、ignore、skip(默认值为:abort)
--load-media-error-handling <handler> 指定如何处理无法加载的媒体文件:abort、ignore、skip(默认值为:ignore)
--disable-local-file-access 不允许一个本地文件加载其他的本地文件,使用命令行参数 --allow 指定的目录除外。
--enable-local-file-access 允许将本地文件转换到其他本地文件中读取(默认设置)
--exclude-from-outline 不要将页面包含在内容表和大纲中
--include-in-outline 将页面包含在内容表和大纲中(默认设置)
--page-offset <offset> 设置页码的起始值(默认值为:0)
--minimum-font-size <int> 设置最小的字体大小
--disable-plugins 禁用已安装的插件(默认设置)
--enable-plugins 启用已安装的插件(但插件可能不起作用)
--post <name> <value> 添加一个附加字段(可以重复使用该参数添加多个附加字段)
--post-file <name> <value> 添加一个附加文件(可以重复使用该参数添加多个附加文件)
--print-media-type 使用打印媒体类型代替屏幕
--no-print-media-type 不使用打印媒体类型代替屏幕(默认设置)
--proxy <proxy> 使用代理
--radiobutton-checked-svg <path> 使用指定的SVG文件渲染选中的单选按钮
--radiobutton-svg <path> 使用指定的SVG文件渲染未选中的单选按钮
--run-sript <js> 在页面加载完成后运行这个额外的 JavaScript(可以重复使用该参数添加多个额外的 JavaScript)
--disable-smart-shrinking 禁用智能收缩策略
--enable-smart-shrinking 启用智能收缩策略(默认设置)
--stop-slow-scripts 停止运行缓慢的 JavaScript 代码(默认设置)
--no-stop-slow-scripts 不停止运行缓慢的 JavaScript 代码
--disable-toc-back-links 禁止从标头链接到内容表(默认设置)
--enable-toc-back-links 允许从标头链接到内容表
--user-style-sheet <url> 指定一个用户样式表,以便加载每个页面
--username <username> HTTP 身份认证的用户名
--password <password> HTTP 身份认证的密码
--viewport-size <> 设置窗口大小,需要自定义滚动条或 CSS 属性来自适应窗口大小
--window-status <windowStatus> 等到window.status等于这个字符串前渲染页面
--zoom <float> 设置转换成 PDF 时页面的缩放比例(默认值为:1)
--default-header 添加一个默认的页眉,左边是页面的名称,右边是页码,是下面的缩写:--header-left='[webpage]' --header-right='[page]/[toPage]' --top 2cm --header-line页眉和页脚选项:
--footer-left <text> 居左显示页脚文本
--footer-center <text> 居中显示页脚文本
--footer-right <text> 居右显示页脚文本
--footer-font-name <name> 设置页脚的字体名称(默认值为:Arial)
--footer-font-size <size> 设置页脚的字体大小(默认值为:12)
--footer-html <url> 添加一个 HTML 作为页脚
--footer-line 在页脚上方显示一条直线
--no-footer-line 不在页脚上方显示一条直线(默认设置)
--footer-spacing <real> 设置页脚与内容之间的间距,单位毫米(mm)(默认值为:0)--header-left <text> 居左显示页眉文本
--header-center <text> 居中显示页眉文本
--header-right <text> 居右显示页眉文本
--header-font-name <name> 设置页眉的字体名称(默认值为:Arial)
--header-font-size <size> 设置页眉的字体大小(默认值为:12)
--header-html <url> 添加一个 HTML 作为页眉
--header-line 在页眉下方显示一条直线
--no-header-line 不在页眉下方显示一条直线(默认设置)
--header-spacing <real> 设置页眉与内容之间的间距,单位毫米(mm)(默认值为:0)
--replace <name> <value> 在页眉和页脚中替换指定名称的值(可以重复使用该参数指定多个需要替换的名称和值)内容表选项:
--disable-dotted-lines 不要在 TOC 中使用虚线
--toc-header-text <text> 设置 TOC 的标题文本(默认值为:内容表)
--toc-level-indentation <width> 在 TOC 缩进每一级的标题长度(默认值为:1em)
--disable-toc-links 在 TOC 中不生成指向内容锚点的超链接
--toc-text-size-shrink <real> 在 TOC 中的每一级标题,字体按这个比例缩放(默认值为:0.8)
--xsl-style-sheet <file> 使用指定的 XSL 样式表打印内容表页眉和页脚:
页眉和页脚可以使用参数 --header-* 和 --footer-* 添加到文档中。
有些参数也需要提供一个字符串 text 作为参数值。例如:--header-left
可以在 text 中使用以下变量,将会把以下变量替换为对应的值。* [page] 当前正在打印的页面的页码
* [frompage] 打印的第一页的页码
* [topage] 打印的最后一页的页码
* [webpage] 当前正在打印的页面的 URL
* [section] 当前正在打印的章节的名称
* [subsection] 当前正在打印的分段的名称
* [date] 本地系统格式的当前日期
* [isodate] ISO 8601 扩展格式的当前日期
* [time] 本地系统格式的当前时间
* [title] 当前页对象的标题
* [doctitle] 输出文档的标题
* [sitepage] 当前正在处理的对象中当前页面的页码
* [sitepages] 当前正在处理的对象中的总页数举个例子:
--header-right "Page [page] of [toPage]",
会在页面的右上角生成一个类似 Page x of y 的字符串,
其中 x 是当前页面的页码, y 是当前文档最后一页的页码。
C# 使用 wkhtmltopdf 将HTML文本或文件转换为PDF相关推荐
- 如何在Windows和Mac上将PNG文件转换为PDF?
文章来源:https://www.reneelab.com.cn/convert-png-to-pdf.html 目录 一.什么是PNG与PDF 二.如何在Windows上将PNG转换为PDF 1.都 ...
- msg文件转成html文件,如何将MSG格式的文件转换为PDF格式文件?
三.如何将MSG格式的文件转换为PDF格式的文件? 想要随时查看MSG格式文件的话,格式转换就成为了理想的途径,下面将教大家将MSG格式的文件转换为PDF格式文件三种方式,一起去学习一下吧. 1.借助 ...
- 如何将CAJ文件转换为PDF文件
转载自:如何将CAJ文件转换为PDF文件 如何将CAJ文件转换为PDF文件 1.使用官方的CAJViewer将CAJ文件打印PDF: 2.在线网站转换 3.直接从知网下载(推荐) ps:书签添加方法 ...
- 如何在 C# 中以编程方式将 IGS/IGES 文件转换为 PDF?
计算机辅助设计应用程序使用 IGS 文件,因为它们包含设计信息.您可以将 IGS 文件转换为 PDF 格式的文档,以便在多个操作系统和环境中查看内容. 使用 C# 以编程方式将 IGS 或 IGES ...
- Word处理控件Aspose.Words功能演示:在 Python 中将 TXT 文件转换为 PDF
各种人使用记事本以TXT格式记下重点或快速创建笔记.此外,TXT 文件用于在各种应用程序中存储纯文本.但是,由于记事本不提供高级功能,因此 TXT 文件通常会转换为PDF.为了以编程方式自动将 TXT ...
- python批量pdf转word,python批量实现Word文件转换为PDF文件
本文为大家分享了python批量转换Word文件为PDF文件的具体方法,供大家参考,具体内容如下 1.目的 通过万能的Python把一个目录下的所有Word文件转换为PDF文件. 2.遍历目录 作者总 ...
- python office转pdf_python 如何将office文件转换为PDF
在平时的工作中,难免需要一些 小Tip 来解决工作中遇到的问题,今天的文章给大家安利一个方便快捷的小技巧,将 Office(doc/docx/ppt/pptx/xls/xlsx)文件批量或者单一文件转 ...
- java pdf 转txt文件怎么打开_使用iText将TXT文件转换为PDF(保留格式)
我正在尝试使用iText库将.txt文件转换为.pdf文件.我面临的问题如下: 我在txt文件中有清晰的格式,与此类似: TEXT ******************* Other text her ...
- office文件转换为pdf文件
office文件转换为pdf文件 首先安装openoffice,自行百度 导入jar包,自行百度 引入坐标: <!-- 转pdf配置 --><dependency><gr ...
最新文章
- css盒子教程,彻底弄懂css盒子模式(div布局快速入门)_css教程
- 每日程序C语言24-回文数字的判断
- Linq之Lambda表达式初步认识
- mydumper备份原理和使用方法
- 多期高收入的C++on-job学员
- 如何选择使用结构或类
- linux用户及组管理实训,实训 Linux下用户和组的管理和权限命令操作.doc
- Docker的卸载与安装(阿里云)
- 云杰恒指:7.29恒指期货实盘指导交易复盘
- [置顶] 【游戏产业的5年之变】
- 短视频的海绵宝宝配音怎么制作?这可能是最容易上手的配音教程
- 微软为什么能转型成功?
- 使用ConnectBot开源项目在android设备上管理你的linux系统
- 输出第三个单词c语言,基础c语言问题:要求输入任意单词,输出单词的每个字母后的第三个字母。例如输入yeah,则输出bhdk...
- altium designer创建圆形实心填充
- Android6.0 源码添加黑名单拦截电话和短信记录
- 【笔记】莫比乌斯反演(1)
- java获取gps 串口_从串口读取GPS数据
- Verilog HDL**两位数码管计数器,关于reg位数的问题
- 微软应用商店Microsoft Store错误代码: 0xC002001B官方解决方法和Windows计算器替代品Qalculate