多頁 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…

Read more

Gaze Guard 短影片旁白的 TTS 成本與隱私防護示意圖

短影片旁白的成本,其實比我想像低

我最近在做一支 Gaze Guard 的 20 秒產品介紹影片。 原本想說簡單做個動畫就好。 後來想說如果有配音,會感覺比較生動也比較能夠描述使用的情境和達成的效果。 這次我測了什麼 我測的是產品介紹影片用的英文旁白。 工具底層使用的是 Edge TTS,也就是 Microsoft Edge 的線上 Text-to-Speech 服務。常見的底層工具是 edge-tts。 這不是正式 Azure Speech API 的計費路徑。 在我這次的環境裡,它沒有要求 API key,也沒有回傳可見的 per-use billing。 所以這次測試本身,比較像是快速 prototype。 如果未來要正式商用、穩定大量產出,就要回頭看 Azure Speech、OpenAI TTS、ElevenLabs 這類正式付費方案。

By SteepingLogic
用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard

# 用 Cloudflare Tunnel,從外面連回本機 Hermes Dashboard 我有一台 local Hermes。 平常它就在自己的機器上跑。 可能是家裡的桌機。 可能是 NAS。 可能是一台一直開著的 Linux box。 也可能只是我自己的筆電。 問題是,人一離開那個網路,Hermes dashboard 就變成一個只存在於 localhost 的東西。 我想在外面打開它。 但我沒有 static IP。 沒有買網域。 也不想進路由器開 port forwarding。 因為那條路通常長這樣: * 找 public IP * 設定 NAT * 開 port * 處理防火牆 * 補 HTTPS * 設定憑證 * 再擔心 origin IP 被掃 非常友善。 所以這篇先走另一條路:

By SteepingLogic
Invoshot 開發日記|正向回饋

Invoshot 開發日記|正向回饋

想信很多人在開發的時候都常常會做一件事,那就是: 不斷地反覆思考,在腦袋內把流程跑過很多次,然後思考哪裡可以做得更好 不限坐在電腦前的時後,可能是在捷運上,在人行道上, 在馬桶上或是在洗澡的時候 🤪 我不斷地在想:AI 辨識完一張發票後,使用者接下來最需要的是什麼? 每個欄位都要核對嗎? 這麼多欄位真的不會漏看嗎? 所以我在 Invoshot 裡加了提醒功能。 辨識結果出來後,系統會把比較需要注意的地方標出來。 不是把所有不確定都丟給使用者,而是把他真正需要介入的那幾秒鐘留出來。 今天收到一則訊息: 今天用了有新增提醒功能很棒! 真的有變輕鬆 😎 看到這句的時候,我第一個想到的是: 原來那些只是我腦內風暴的優化項目,使用者是真的可以感受到差異的! 感覺又有動力了!

By SteepingLogic