【W(wǎng)eb技術(shù)】796- 將 HTML 生成 PDF 并下載

作者:grain先森
鏈接:https://www.jianshu.com/p/4a550e07d50b
1. html2canvas
我們可以直接在瀏覽器端使用html2canvas,對(duì)整個(gè)或局部頁(yè)面進(jìn)行“截圖”。但這并不是真的截圖,而是通過(guò)遍歷頁(yè)面DOM結(jié)構(gòu),收集所有元素信息及相應(yīng)樣式,渲染出canvas image。
使用的API也很簡(jiǎn)潔,下面代碼可以將某個(gè)元素渲染成canvas:
html2canvas(element, { onrendered: function(canvas) {// canvas is the final rendered}});
html2canvas(element, { onrendered: function(canvas) {document.body.appendChild(canvas);}});
html2canvas example one ...it is a title
Stone Giant...Stone Giant
Coming ...
以一團(tuán)石頭...
2. jsPDF
// 默認(rèn)a4大小,豎直方向,mm單位的PDFvar doc = new jsPDF();// 添加文本‘Download PDF’doc.text('Download PDF!', 10, 10);doc.save('a4.pdf');
使用方法如下:
// 三個(gè)參數(shù),第一個(gè)方向,第二個(gè)單位,第三個(gè)尺寸格式var doc = new jsPDF('landscape','pt',[205, 115])// 將圖片轉(zhuǎn)化為dataUrlvar imageData = ‘data:image/png;base64,iVBORw0KGgo...’;doc.addImage(imageData, 'PNG', 0, 0, 205, 115);doc.save('a4.pdf');
// 三個(gè)參數(shù),第一個(gè)方向,第二個(gè)尺寸,第三個(gè)尺寸格式var doc = new jsPDF('landscape','pt',[205, 155])// 將圖片轉(zhuǎn)化為dataUrlvar imageData = ‘data:image/png;base64,iVBORw0KGgo...’;//設(shè)置字體大小doc.setFontSize(20);//10,20這兩參數(shù)控制文字距離左邊,與上邊的距離doc.text('Stone',?10,?20);//?0,?40,?控制文字距離左邊,與上邊的距離doc.addImage(imageData, 'PNG', 0, 40, 205, 115);doc.save('a4.pdf')
3. html2canvas + jsPDF
將demo1的例子修改下:
<script type="text/javascript" src="./js/jsPdf.debug.js">script><script type="text/javascript">var downPdf = document.getElementById("renderPdf");downPdf.onclick = function() {html2canvas(document.body, {onrendered:function(canvas) {//返回圖片dataURL,參數(shù):圖片格式和清晰度(0-1)var pageData = canvas.toDataURL('image/jpeg', 1.0);?//方向默認(rèn)豎直,尺寸ponits,格式a4[595.28,841.89]???????????????????var?pdf?=?new?jsPDF('',?'pt',?'a4');????????????????????//addImage后兩個(gè)參數(shù)控制添加圖片的尺寸,此處將頁(yè)面高度按照a4紙寬高比列進(jìn)行壓縮????????????????????pdf.addImage(pageData,?'JPEG',?0,?0,?595.28,?592.28/canvas.width?*?canvas.height?);?????pdf.save('stone.pdf');??????????????}??????????})??????}??????????script>
addPage(),我們可以通過(guò)?pdf.addPage(),來(lái)添加一頁(yè)pdf,然后通過(guò)?pdf.addImage(...),將圖片賦予這頁(yè)pdf來(lái)顯示。那么我們?nèi)绾未_定哪里分頁(yè)?
pageHeight,超過(guò)這個(gè)高度的內(nèi)容放入下一頁(yè)pdf。addImage將第一頁(yè)圖片添加到pdf中,超過(guò)一頁(yè)內(nèi)容,通過(guò)?addPage()添加pdf頁(yè)數(shù),然后再通過(guò)?addImage將下一頁(yè)圖片添加到pdf中。pageHeight先將整頁(yè)內(nèi)容生成的canvas圖片分割成對(duì)應(yīng)的小圖片,然后一個(gè)蘿卜一個(gè)坑,一頁(yè)一頁(yè)?addImage進(jìn)去。What? 想一想我們的canvas是腫么來(lái)的,不用拉上去,直接看下面:
html2canvas(document.body, {onrendered:function(canvas) {//it is here we handle the canvas}})
累的話 :)可以看看下面這種方法。
我提供的思路是我們只生成一個(gè)canvas,對(duì)就一個(gè),轉(zhuǎn)化元素就是你要轉(zhuǎn)成pdf內(nèi)容的母元素,在這篇demo里就是 body了;其他不變,也是超過(guò)一頁(yè)內(nèi)容就?
addPage,然后?addImage,只不過(guò)這里添加的是同一個(gè)canvas。超過(guò)jsPDF實(shí)例格式尺寸的內(nèi)容不顯示(?
var pdf=newjsPDF('','pt','a4');demo中就是a4紙的尺寸)addImage有兩個(gè)參數(shù)可以控制圖片在pdf中的位置
還是看代碼吧:
html2canvas(document.body, {onrendered:function(canvas) {var contentWidth = canvas.width;var contentHeight = canvas.height;//一頁(yè)pdf顯示html頁(yè)面生成的canvas高度;var pageHeight = contentWidth / 592.28 * 841.89;//未生成pdf的html頁(yè)面高度var leftHeight = contentHeight;//頁(yè)面偏移var position = 0;//a4紙的尺寸[595.28,841.89],html頁(yè)面生成的canvas在pdf中圖片的寬高var imgWidth = 595.28;var imgHeight = 592.28/contentWidth * contentHeight;var pageData = canvas.toDataURL('image/jpeg', 1.0);var pdf = new jsPDF('', 'pt', 'a4');//有兩個(gè)高度需要區(qū)分,一個(gè)是html頁(yè)面的實(shí)際高度,和生成pdf的頁(yè)面高度(841.89)//當(dāng)內(nèi)容未超過(guò)pdf一頁(yè)顯示的范圍,無(wú)需分頁(yè)if (leftHeight < pageHeight) {pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight );} else {while(leftHeight > 0) {pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)leftHeight -= pageHeight;position -= 841.89;//避免添加空白頁(yè)if(leftHeight > 0) {pdf.addPage();}}}pdf.save('content.pdf');}})
修改
imgWidth,并且在addImage時(shí)x方向參數(shù)設(shè)置你要的邊距,具體代碼如下:var imgWidth = 555.28;var imgHeight = 555.28/contentWidth * contentHeight;...pdf.addImage(pageData, 'JPEG', 20, 0, imgWidth, imgHeight );...pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight);

回復(fù)“加群”與大佬們一起交流學(xué)習(xí)~
點(diǎn)擊“閱讀原文”查看 80+ 篇原創(chuàng)文章
評(píng)論
圖片
表情
