需求分为两步:报告预览和报告生成。html
报告生成须要对第一步生成的HTML进行PDF的转换生成,HTML2PDF的方式又分为两种:前端
下面以一个体检报告的案例进行这两种方案的说明:
体检报告展现形式以下,格式相对固定,分为四个页面:我的信息页,建议页,原理页,我的信息页与建议页数据来源于服务器。
report.pngnode
canvas是HTML5标准中新增的元素,可用于经过使用JS的脚原本绘制图形。canvas提供了toDataURL/toBlob方法,用于把canvas中的内容转换为图片,API文档以下(来源于MDN):nginx
因为HTML文档再浏览器中是以DOM树的形式存在,因此咱们能够经过三步完成HTML到PDF的转换:git
完整代码实现:https://github.com/simonwoo/d...github
截图以下,点击下载按钮可进行pdf生产:web
该方案彻底基于客户端的方式生成,不须要服务器进行支持。在使用该方案的过程当中,发现了一些问题:ajax
puppeteer是google推出的headless浏览器,即没有图形界面的浏览器,但又能够实现普通浏览器HTML/JS/CSS的渲染,以及其余基本浏览器功能。你能够理解为一个没有界面的Chrome浏览器。主要有如下几种使用场景:npm
经过理解puppeteer的功能,咱们能够开启一个实例去渲染HTML报告,而后再利用其提供的转换PDF功能进行PDF的生成。canvas
两个重要的API:
puppeteer使用一个小例子,将百度网页转换为pdf:
完整代码以下:
项目启动流程以下:
整个服务架构以下:
node服务器经过路由增长一个pdf生成的controller,该controller经过启动puppeteer实例去加载localhost:3000的页面并生成pdf。直接在浏览器中经过http://localhost:7001/pdf便可访问到生成的pdf.
在实际环境中,前端页面可部署在nginx服务器上或者直接放在Node服务器上,puppeteer也支持使用cookie的操做,这样能够避免一些须要身份认证的问题。
相比客户端生成方式,使用puppeteer生成的pdf质量比较高,可知足生产要求。
本文中提到的两种方案中,均省去了ajax后端请求数据部分,读者可根据须要自行增长。