這篇文章將為大家詳細(xì)講解有關(guān)純js如何實(shí)現(xiàn)html轉(zhuǎn)pdf,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)提供天壇街道企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為天壇街道眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。項(xiàng)目開(kāi)發(fā)中遇到了一個(gè)變態(tài)需求,需要把一整個(gè)頁(yè)面導(dǎo)出為pdf格式,而且要保留頁(yè)面上的所有的表格、svg圖片和樣式。
簡(jiǎn)而言之,就是希望像截圖一樣,把整個(gè)頁(yè)面截下來(lái),然后保存成pdf。
查了一下,能夠?qū)崿F(xiàn)html轉(zhuǎn)pdf的方法還是挺多的,大概有以下幾種:
1、大部分瀏覽器就有這個(gè)功能。然而我們客戶要的可不是這個(gè),人家要的是能夠在系統(tǒng)中主動(dòng)觸發(fā)的導(dǎo)出為pdf功能,所以這種方案pass。
2、利用第三方工具。我找到了一種利用wkhtmltopdf這種工具來(lái)導(dǎo)出的方案,自己在我們的項(xiàng)目中試了一下,效果不好,而且對(duì)svg圖片的支持也不行。pass。
3、還有一種是利用iText類后臺(tái)生成java文件。但因?yàn)樾枰獙?dǎo)出的這個(gè)頁(yè)面是動(dòng)態(tài)頁(yè)面,而且直接把頁(yè)面?zhèn)鹘o后臺(tái)會(huì)丟失大量樣式,所以還是pass。
最后沒(méi)什么好的辦法,只能退而求其次,想著要不先把html頁(yè)面轉(zhuǎn)成圖片,再把圖片導(dǎo)出為pdf。因?yàn)橐С钟脩魧?dǎo)出下載,而且要保留樣式,所以最好是純js前端實(shí)現(xiàn)。
html轉(zhuǎn)canvas的話,就用html2canvas這個(gè)js,這個(gè)網(wǎng)上介紹比較多了,這里就不廢話了。
比較麻煩的是svg圖片,直接用html2canvas無(wú)法把svg標(biāo)簽的內(nèi)容轉(zhuǎn)成canvas,最后查了一圈資料后,鎖定了canvg這個(gè)js。canvg是谷歌的一個(gè)插件,可以將svg標(biāo)簽內(nèi)容轉(zhuǎn)成canvas。具體到我們的項(xiàng)目,還有一個(gè)難點(diǎn),就是如何把glyphicons這種字體圖標(biāo)也轉(zhuǎn)成canvas,因?yàn)樵诓煌瑸g覽器下對(duì)這種字體圖標(biāo)的支持是完全不一樣的。最后找到的方法是用char code來(lái)替換這些字體圖標(biāo),重新繪制成canvas。由canvas生成圖片不用廢話。由圖片生成pdf用jsPDF實(shí)現(xiàn)。 折騰了大半天,總算把整個(gè)流程打通了,接下來(lái)一步一步貼上代碼。
第一步:把對(duì)應(yīng)dom節(jié)點(diǎn)里所有的svg元素替換成canvas
svg2canvas: function(targetElem) { var svgElem = targetElem.find('svg'); svgElem.each(function(index, node) { var parentNode = node.parentNode; //由于現(xiàn)在的IE不支持直接對(duì)svg標(biāo)簽node取內(nèi)容,所以需要在當(dāng)前標(biāo)簽外面套一層div,通過(guò)外層div的innerHTML屬性來(lái)獲取 var tempNode = document.createElement('div'); tempNode.appendChild(node); var svg = tempNode.innerHTML; var canvas = document.createElement('canvas'); //轉(zhuǎn)換 canvg(canvas, svg); parentNode.appendChild(canvas); }); }
第二步:把glyphicons字體轉(zhuǎn)成canvas。如果項(xiàng)目中沒(méi)有用到glyphicons字體圖標(biāo),可忽略這一步
glyphicons2canvas: function(targetElem, fontClassName, fontFamilyName) { var iconElems = targetElem.find('.' + fontClassName); iconElems.each(function(index, inconNode) { var fontSize = $(inconNode).css("font-size"); var iconColor = $(inconNode).css("color"); var styleContent = $(inconNode).attr('style'); //去掉"px" fontSize = fontSize.replace("px", ""); var charCode = getCharCodeByGlyphiconsName(iconName); var myCanvas = document.createElement('canvas'); //把canva寬高各增加2是為了顯示圖標(biāo)完整 myCanvas.width = parseInt(fontSize) + 2; myCanvas.height = parseInt(fontSize) + 2; myCanvas.style = styleContent; var ctx = myCanvas.getContext('2d'); //設(shè)置繪圖內(nèi)容的顏色 ctx.fillStyle = iconColor; //設(shè)置繪圖的字體大小以及font-family的名字 ctx.font = fontSize + 'px ' + fontFamilyName; ctx.fillText(String.fromCharCode(charCode), 1, parseInt(fontSize) + 1); $(inconNode).replaceWith(myCanvas); }); } //根據(jù)glyphicons/glyphicon圖標(biāo)的類名獲取到對(duì)應(yīng)的char code getCharCodeByGlyphiconsName: function(iconName) { switch (iconName) { case("glyphicons-resize-full"): return "0xE216"; case ("glyphicons-chevron-left"): return "0xE225"; default: return ""; } }
第三步:html轉(zhuǎn)canvas轉(zhuǎn)圖片再轉(zhuǎn)pdf
html2canvas($("#myExportArea"), { onrendered: function(canvas) { var imgData = canvas.toDataURL('image/jpeg'); var img = new Image(); img.src = imgData; //根據(jù)圖片的尺寸設(shè)置pdf的規(guī)格,要在圖片加載成功時(shí)執(zhí)行,之所以要*0.225是因?yàn)楸壤龁?wèn)題 img.onload = function() { //此處需要注意,pdf橫置和豎置兩個(gè)屬性,需要根據(jù)寬高的比例來(lái)調(diào)整,不然會(huì)出現(xiàn)顯示不完全的問(wèn)題 if (this.width > this.height) { var doc = new jsPDF('l', 'mm', [this.width * 0.225, this.height * 0.225]); } else { var doc = new jsPDF('p', 'mm', [this.width * 0.225, this.height * 0.225]); } doc.addImage(imgData, 'jpeg', 0, 0, this.width * 0.225, this.height * 0.225); //根據(jù)下載保存成不同的文件名 doc.save('report_pdf_' + new Date().getTime() + '.pdf'); } }, background: "#fff", //這里給生成的圖片默認(rèn)背景,不然的話,如果你的html根節(jié)點(diǎn)沒(méi)設(shè)置背景的話,會(huì)用黑色填充。 allowTaint: true //避免一些不識(shí)別的圖片干擾,默認(rèn)為false,遇到不識(shí)別的圖片干擾則會(huì)停止處理html2canvas });
雖然最后勉強(qiáng)完成了客戶的要求,但是生成的pdf效果明顯不如正常截圖來(lái)的清晰……水平所限,暫時(shí)只能想到這種方法,如果大家有更好的辦法,歡迎指點(diǎn)。
關(guān)于“純js如何實(shí)現(xiàn)html轉(zhuǎn)pdf”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.rwnh.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:純js如何實(shí)現(xiàn)html轉(zhuǎn)pdf-創(chuàng)新互聯(lián)
當(dāng)前URL:http://www.rwnh.cn/article38/cciesp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、建站公司、網(wǎng)站排名、品牌網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容