項目開發(fā)中遇到了一個變態(tài)需求,需要把一整個頁面導(dǎo)出為pdf格式,而且要保留頁面上的所有的表格、svg圖片和樣式。
簡而言之,就是希望像截圖一樣,把整個頁面截下來,然后保存成pdf。
咋不上天呢……
查了一下,能夠?qū)崿F(xiàn)html轉(zhuǎn)pdf的方法還是挺多的,大概有以下幾種:
1、大部分瀏覽器就有這個功能。然而我們客戶要的可不是這個,人家要的是能夠在系統(tǒng)中主動觸發(fā)的導(dǎo)出為pdf功能,所以這種方案pass。
2、利用第三方工具。我找到了一種利用wkhtmltopdf這種工具來導(dǎo)出的方案,自己在我們的項目中試了一下,效果不好,而且對svg圖片的支持也不行。pass。
3、還有一種是利用iText類后臺生成java文件。但因為需要導(dǎo)出的這個頁面是動態(tài)頁面,而且直接把頁面?zhèn)鹘o后臺會丟失大量樣式,所以還是pass。
最后沒什么好的辦法,只能退而求其次,想著要不先把html頁面轉(zhuǎn)成圖片,再把圖片導(dǎo)出為pdf。因為要支持用戶導(dǎo)出下載,而且要保留樣式,所以最好是純js前端實現(xiàn)。
html轉(zhuǎn)canvas的話,就用html2canvas這個js,這個網(wǎng)上介紹比較多了,這里就不廢話了。
比較麻煩的是svg圖片,直接用html2canvas無法把svg標簽的內(nèi)容轉(zhuǎn)成canvas,最后查了一圈資料后,鎖定了canvg這個js。canvg是谷歌的一個插件,可以將svg標簽內(nèi)容轉(zhuǎn)成canvas。具體到我們的項目,還有一個難點,就是如何把glyphicons這種字體圖標也轉(zhuǎn)成canvas,因為在不同瀏覽器下對這種字體圖標的支持是完全不一樣的。最后找到的方法是用char code來替換這些字體圖標,重新繪制成canvas。由canvas生成圖片不用廢話。由圖片生成pdf用jsPDF實現(xiàn)。 折騰了大半天,總算把整個流程打通了,接下來一步一步貼上代碼。

第一步:把對應(yīng)dom節(jié)點里所有的svg元素替換成canvas

Android培訓(xùn),安卓培訓(xùn),手機開發(fā)培訓(xùn),移動開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

 1 svg2canvas: function(targetElem) { 2   var svgElem = targetElem.find('svg'); 3   svgElem.each(function(index, node) { 4     var parentNode = node.parentNode; 5     //由于現(xiàn)在的IE不支持直接對svg標簽node取內(nèi)容,所以需要在當前標簽外面套一層div,通過外層div的innerHTML屬性來獲取 6     var tempNode = document.createElement('div'); 7     tempNode.appendChild(node); 8     var svg = tempNode.innerHTML; 9     var canvas = document.createElement('canvas');10  
        
		

網(wǎng)友評論