純前端js導出pdf,已經用於生產環境。
工具: 1、html2canvas,一種讓html轉換為圖片的工具。
2、pdfmake或者jspdf ,一種生成、編輯pdf,並且導出pdf的工具。
pdfmake:http://pdfmake.org
優點: 能夠支持中文,具有部分自適應布局功能,需要vfs_fonts.js 字體文件。
缺點:支持中文的vfs_fonts.js文件一般較大。 如果圖片過大,不會自動分頁。
生成vfs_fonts.js 文件的方法如圖,npm install pdfmake, 添加examples/fonts文件夾,再在里面放入需要的.ttf文件。再 gulp buildFonts 生產文件,文件在存放在build中。一般js文件會比.ttf文件大一倍,目前發現黑體比較小,1.5M左右。
第二種 jspdf
優點:圖片按照background-position 來定位到pdf中。
缺點:不直接支持中文(但可以使用文字圖片化代替)。
純前端導出pdf文件,不僅需要分頁,也需要pdf清晰。這兩個難題都是有技巧可以解決的。目前我使用的方法是 使用html2canvas將html轉換為圖片,再用jspdf將圖片一張一張貼到pdf中。
分頁:不管jspdf還是pdfmake都需要使用高度較小的圖片,圖片高度越小,分頁效果就越好。所以一個table盡量一個tr就是一張圖。如此分頁時后只要判斷下一張圖片貼上去后是否會超過pdf內容區(你可以設置頁眉頁腳,左右邊距高度)高度,超過了就換頁。
pdf清晰度:如果利用了echart之類,一定要用它給的api獲取dataURL,設置分辨率倍數多一點,導出的圖片非常清晰,這樣生產的pdf才會清晰。如果是普通元素,如果發現導出的圖片不夠清晰,可以專門寫一個用於導出的頁面。此頁面所有內容都放大2 倍,然后設置left:-9999隱藏(不可display:none)。當html2canvas轉換此頁面的為圖片的時候,圖片會非常大,然后使用pdf編輯工具讓圖片等比縮放,會很清晰。html2canvas option里也有個scale參數,也可以調,但太大會報錯。