前段時間,客戶提了個需求,想把訂單合同作成線上簽名並在線生成合同,生成的合同還要打印出來,還要我兩天作完,WTF,接到需求的那一刻我是懵逼的,我只是個瑟瑟發抖的小前端啊,話說這也須要研究一下怎麼作的吧。html
瑟瑟發抖之餘,我就在考慮具體實現的步驟,簡單劃分了下 --->前端
看完是否是以爲很簡單,不用兩天,給我三五個小時就搞定了。事實證實我仍是太年輕了,我google了幾個案例後,發現最佳實現方案是用signature_pad實現簽名,而後用(html2canvas+jsPdf)生成pdf文檔。
因而我便開始動手寫demo,簽名沒啥問題,我以前本身也寫過canvas實現寫字,可是懶得再去重構項目和作模塊化擴展。html2canvas也沒問題,用網頁生成的圖片文件很清晰,還原度很高,至於生成pdf嘛,效果就通常了。git
主要問題是以下:github
我也嘗試過多種方案,依舊沒能解決,期間想過用一個隱藏dom來寫一套A4紙的樣式用於打印,後來發現清晰度和裁剪問題很差解決,因而便換了種思路,想經過服務端來解決。
在github上逛了逛,發現了pdfmake這個神器,立馬看了文檔,開始寫demo,實踐了一遍後發現,這個比較靠譜,生成的文檔也很清晰。npm
具體能實現的以下:json
這些就夠了,但是還存在一些問題(不知道是否是打開的方式不對)canvas
最終我仍是用這個插件實現了想要的效果。
項目上線後,我本身擼了個demo,放在github上,有興趣的能夠下載下來看一看瀏覽器
//項目結構 ├── README.md ├── app │ ├── fonts │ │ └── msyh.ttf //字體文件 │ ├── images │ │ ├── qrcode.png //用到的圖片 │ │ └── snh.jpg │ ├── middleware │ │ └── generatePdf.middleware.js //生成文檔js │ ├── models │ │ └── doc.model.js //文檔原型 │ └── routers │ └── index.js //路由文件 ├── app.js ├── package.json └── tempFiles //緩存目錄
效果截圖(截圖效果太渣,文檔很清晰,打印徹底沒問題)緩存
有須要的能夠自取app
git clone https://github.com/zangse/GeneratePDF npm install npm run start 在瀏覽器打開 http://localhost:3000/pdf
這個pdfmake也能夠在瀏覽器端實現,鑑於須要加載的字體太大(微軟雅黑.ttf ---> 10M+),我放棄了這個操做。