多頁 Html2pdf.js 前端畫面轉 PDF 並用 ajax 傳送 (含頁尾)

自動將畫面內容分頁,並加入頁首頁尾後,用 html2pdf.js 這個套件包將 html 畫面轉為 pdf 並透過 ajax 傳輸資料

分享
多頁 Html2pdf.js 前端畫面轉 PDF 並用 ajax 傳送 (含頁尾)

Html2pdf.js 前端畫面轉 PDF 並用 ajax 傳送

html2pdf 官方文件內容實在是太少了,看完了還是一頭霧水
參考了多人的代碼並且在實作的過程中踩了一堆坑
趕緊紀錄一下避免以後忘了又要重踩一次

程式流程async function transfer() {
 await changeHtmlTagsIntoSpan()
 await cutPage()let docif (頁數 > 5) {
   doc = await renderLargePdf()
 } else {
   doc = await renderPdf()
 }sendPdf(doc)
}

PDF頁數 <= 5async function renderPdf() {opt = {
   margin: 10,
   pagebreak: { before:['.page-break'], avoid: 'img' },
   filename: 'test.pdf',
   jsPDF: { format: 'a4', orientation: 'portrait' },
   html2canvas:  {
     scale: 2,
     useCORS: true, // 沒有的話轉成PDF後所有的<img>內容都會不見
   }
 }let content = document.getElementById('body')let doc = await html2pdf()
   .from(content)
   .set(opt)
   .toPdf()
   .get('pdf')
   .then(function (pdf) {
     let totalPages = pdf.internal.getNumberOfPages()
     let onePageHeight = pdf.internal.pageSize.getHeight()
     let onePageWidth = pdf.internal.pageSize.getWidth()// 這邊使用google的開源中文字,不然原本html2pdf不支援UTF-8中文輸出
     pdf.addFileToVFS('TaipeiSansTCBeta-normal', TaipeiSansTCBeta);
     pdf.addFont('TaipeiSansTCBeta-normal', 'TaipeiSansTCBeta', 'normal');// 添加完後必須 Set  
     pdf.setFont('TaipeiSansTCBeta');
     pdf.setFontSize(16)
     pdf.setTextColor('red')// 讀取每頁設定頁尾
     for (let page = 1; i <= totalPages; i++) {        
       pdf.setPage(page)
       pdf.text(page, 15, onePageHeight - 10)
       pdf.text(date(), onePageWidth - 50, onePageHeight - 10)
     }return pdf
   })return doc
}

Ajax 傳送 pdffunction sendPdf(pdf) {
 $.ajax({
   type: 'POST',
   datatype: 'JSON',
   data: { pdf: btoa(pdf.output()) }, // 重點是要 pdf.output()
   success: function (res) {},
   error: function () {}
 })
}


參考資料:

基於html2canvas實現網頁儲存為圖片及圖片清晰度優化
網頁截圖應用-html2canvas問題研究
How to set header and footer using html2pdf — jspdf javascript plugin?
https://blog.csdn.net/cosmos16/article/details/107951678
html2pdf.js之长页面html转PDF导出
长页面html转PDF导出 html转pdf的用法网上教程搜索一大堆,但公司遇到新需求,需要把6000条数据转为pdf,页面会变空白,后端推前端,前端推后端,那我们就自己研究下吧 网上教程我随便找了一
html2pdf.js如何輸出百頁pdf,看這篇就對了 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
相信大家在做專案的時候,一定都做過報表吧 而我在做報表時,普遍都是使用水晶報表來完成(主要語言為C#) 但水晶報表實在是很不好設計,每次都搞得很蛋疼... 於是我開始學會利用網頁畫好報表再輸出成pdf…

官網:

html2pdf.js
html2pdf.js converts any webpage or element into a printable PDF entirely client-side using html2canvas and jsPDF. HTML…
jsPDF
orientation: 'p', unit: 'mm', format: 'a4', putOnlyUsedFonts:true, floatPrecision: 16 // or "smart", default is 16 }…
Options
These are all of the available configuration options. proxy Url to the proxy which is to be used for loading…