项目经常用到把当前页面导出为pdf,或者生成某个页面或部分的快照。如果是简单的页面快照,不没有太多的渲染,可以用html2canvas.min.js
导出图片或者html2pdf.bundle.min.js
导出为pdf,仅仅在前端就可以完成。但是复杂的页面,以上的导出效果不好,质量也不高。因此我采用PhantomJS
,用后台生成pdf、png等进行导出。
1.PhantomJS简介
PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。
2.下载及安装
官方下载地址:http://phantomjs.org/download.html。目前官方支持三种操作系统,包括windows\Mac OS\Linux这三大主流的环境。根据运行环境选择要下载的包,下面以Windows7为例,我将phantomjs文件放置到D盘根目录下,里面的内容如下图。
3.如何使用
1) 准备一个配置的js文件
在D盘phantomjs目录下新建一个html2pdf.js
1 | /** |
2)测试命令
例如:phantomjs文件夹放于D盘根目录,在phantomjs/bin 目录下(也可以配置环境变量)打开控制台。以我的CSDN博客页面https://blog.csdn.net/xiweiller
导出为PDF为例。输入如下命令:
1 | phantomjs.exe D:/phantomjs/html2pdf.js https://blog.csdn.net/xiweiller D:/phantomjs/blog.pdf |
其中 phantomjs.exe
是执行命令文件, D:/phantomjs/screenshot.js
是执行的配置js文件,https://blog.csdn.net/xiweiller
是目标HTML,D:/phantomjs/blog.pdf
是导出PDF的路径。
3) java中的使用,springboot项目为例
application.yml中添加配置,配置项为phantomjs执行文件路径
1
2
3
4
5htmltopdf:
path:
windows: D:/phantomjs/bin/phantomjs.exe
linux: /root/soft/phantomjs-2.1.1-linux-x86_64/bin/phantomjs
mac:Html转Pdf工具类
参数:
- htmlPath 目标网页访问地址 - pdfPath 导出pdf存放目录 - JSESSIONID 登陆认证时需要传递,用于cookie携带 - domain cookie中获取
1 | /** |
转换工具的调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public void test( HttpServletRequest request ){
// 注意不同部署环境,路径不同。
String htmlUrl = "D:/phantomjs/html2pdf.js";
String pdfPath = "D:/phantomjs/export.pdf"
String JSESSIONID = "";
String domain = request.getServerName();
Cookie[] cookies = request.getCookies();
for(Cookie cookie :cookies){
if("JSESSIONID".equals(cookie.getName())){
JSESSIONID = cookie.getValue();
}
}
//将html转换为pdf文件
boolean isno =htmlToPdf.convert(htmlUrl,pdfPath,JSESSIONID,domain);
}
4) 导出效果图
4. 注意事项
在实际项目使用时,我们必须保证页面异步加载的速度比较快,否则会出现页面渲染不完整的问题。因此在项目中,被导出的目标页面最好能做到快速响应,尽量减少异步请求加载,或者保证异步接口快速响应。