需求分爲兩步:報告預覽和報告生成。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後端請求數據部分,讀者可根據須要自行增長。