js根據dom生成pdf
背景
昨天產品經理找我,說現在下載簡歷的功能,下載到的簡歷和ui的不一樣,希望做成一樣的。我的第一反應就是說那我們給後端寫個靜態頁面,後端把相應的欄位套進去吧。產品又說,每個渠道的簡歷的樣式都不一樣,不節能每個渠道都有對應的一個簡歷的靜態頁面,這樣太複雜。希望通過前端下載,即前端直接儲存簡歷預覽頁到本地。其實,一開始我是拒絕的,但是最後想想,寫這麼多靜態頁面也麻煩,索性就嘗試嘗試來解決這個問題吧。
初定技術方案
拿到這個需求之後,在網上查找了相關的資料。初步有兩個方案。
- 通過
html2canvas
生成圖片,然後再利用jsPDF
將圖片匯入pdf並儲存。 - 通過
html2canvas
FileSaver
將圖片匯入儲存檔案 。
對比了一下這兩種技術方案,應該都能滿足使用。
並且從瀏覽器相容性的角度去看,方案一使用到ArrayBuffer這個類,方案二使用到Bolb類,都只能相容到ie10。然後由於我們這個的需求為儲存PDF檔案,所以我就選了 jsPDF
這個庫作為該方案的解決方案,感覺它專門針對pdf的,顯得更專業點。
小試牛刀
確定了技術方案,那就按照定好的技術方案來執行,根據官方給的demo先寫一段程式碼實現一下基礎功能,看效果如何,程式碼如下:
import html2canvas from "html2canvas"; import * as jsPDF from "jspdf"; html2canvas(dom).then(canvas => { var imgData = canvas.toDataURL('image/jpeg'); var doc = new jsPDF("p", "mm", "a4"); doc.addImage(imgData, 'JPEG', 0, 0,210,297); doc.save(pdfName + ".pdf"); })
這段程式碼很簡單,相信大家也都能看懂。試了一下,確實能生成對應名稱的檔名。開啟檔案一看,感覺有點模糊。。。客戶下載簡歷是需要投遞給hr的,那可不能模糊啊。這個問題需要解決,一定要解決的!!!
解決pdf模糊的問題
上文中也提到了,程式碼很簡單,模糊無非就兩種情況嘛,一種canvas到的圖片模糊,另外一種是儲存pdf的時候模糊了。那我們就一步步試驗排除一下吧。然後把圖片的 DOMString
列印一下,放到瀏覽器看一下,發現圖片有點模糊,那麼問題定位到了,就想辦法解決吧。
首先,我想到了 canvas.toDataURL
的api有一個預設圖片質量的引數,如果不填,則是0.92。之前寫過一篇壓縮上傳的圖片就是通過這個引數壓縮的。那就把它改成1吧。該api的詳細文件,參見
然後在官方github上找到了一個關於清晰度的pr,連線如下: 我是修改清晰度pr , 增加了scale和dpi引數,可以設定畫布的dpi,canvas預設的dpi是96dpi,scale預設為1。當兩者同時存在時,以scale為主,會忽略dpi。
清晰度的問題解決了,那麼是不是大功告成了呢?開始我也這樣認為的,並且也測試著下載了幾個簡歷,完美!但是,我發現當簡歷資料內容很多的時候,下載的pdf字型被壓扁了。我簡單了分析了一下,懷疑是圖片太高,插入一頁pdf,如果圖片的高度大於pdf的高度,是不是會強行的把圖片壓縮成pdf的高度呢?那怎麼辦呢?我們可不可以給pdf做個分頁呢?
分頁解決字型壓扁問題
既然想到了用分頁,那麼就搜尋了一下jsPDF分頁的內容。發現它有一個 addPage
的函式,那就簡單了。我們可以計算出canvas的高度,已知a4紙的高度,如果大於,就需要分頁,使用addPage函式。這裡也是有兩種解決方案,當然,這兩個方案都不是我自己寫的,哈哈哈。
方案一
該方案使用的關鍵技術就是canvas的 drawImage
api,把一個長圖按照pdf的高度截取出好多個短圖,然後插入對應的頁面。這個原作者寫的部落格,使用到了遞迴。原部落格 ,作者已經把程式碼帖進去了,我看了一下,然後使用了一下發現是可以用的。
方案二
方案二使用的關鍵技術是jsPDF的 addImage
的頁面偏移的位置和jsPD超出內容不顯示的特性。其實理解起來也很簡單,第一頁我插入canvas的偏移位置為0,第二頁偏移位置就是一個a4紙的高度,第三頁就是兩個a4紙的高度,以此類推。原部落格 ,作者已經把程式碼帖進去了,我看了一下,然後使用了一下發現是可以用的。
當時我還想,同時插入這麼多canvas會不會使pdf檔案的體積變大,後來看了看,測試下來,發現並不會,那個人推薦第二種方案,因為程式碼少,好理解。看方案一的程式碼,也看了一會兒才看明白,哈哈。
好了,寫到這裡,基本上使用javascript把html轉成pdf下載就寫完了,最後還是要感謝上文中提到的連線。
本人部落格地址, 最近搞了一個非常簡單的工時管理小程式,大佬們可以提提建議。
相關推薦
js根據dom生成pdf
背景 昨天產品經理找我,說現在下載簡歷的功能,下載到的簡歷和ui的不一樣,希望做成一樣的。我的第一反應就是說那我們給後端寫個靜態頁面,後端把相應的欄位套進去吧。產品又說,每個渠道的簡歷的樣式都不一樣,不節能每個渠道都有對應的一個簡歷的靜態頁面,這樣太複雜。希望通過前端下載,即前端直接儲存簡歷預覽頁到本
【Java】itext根據模板生成pdf(包括圖片和表格)
金額 res report als fields positions 創建模板 bst open() 1、導入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar。 2、新建word文檔,創建模板,將文件另存為pdf,並用Ado
JS根據動態生成的字串,驗證是否存在對應function並執行
這個需求是在我搭建前端專案框架的時候遇到的: 由於我走的是前後端完全分離的路線,那前端部分少了後端的支援,所以就少不了要做點路由、分發之類的工作,而在用路由跳轉到新的“頁面”後,我需要執行相應的function來獲取第一版的資料。有個挫一點的方法:寫個swit
使用百度JS模板引擎生成PDF和Word文件
用JS模板引擎能高效的生成pdf和word文件,例子中使用了百度的JS模板引擎,其它模板引擎也是可以的。模板的標籤使用了XDOC,詳細可見:http://xdoc.aliapp.com/xml.html,模板可以視覺化設計 <!DOCTYPE html> <html> <h
java根據模板生成pdf檔案並匯出(轉)
import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import com.itextpdf.text.Document; import com.itextpdf.
freemarker + ItextRender 根據模板生成PDF檔案
1. 製作模板<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &
根據圖片的URL生成PDF保存到本地(前臺js)
避免 就會 需要 uri con bug 是個 tput llb //需要引用html2canvas.js和jspdf.js SavePDF:function(e){ var that = this; $.post("/Biz/D
pdf根據目錄生成書籤
1 準備 ①Adobe Acrobat ②Autobookmark外掛 Step1 下載連結 Step2 關閉Adobe Acrobat後,直接安裝,會自動新增到Adobe Acrobat (使用說
前端生成pdf檔案之pdfmake.js
轉載:點選檢視原文 pdfmake.js是一個簡單的生成pdf檔案的外掛。 pdfmake.js https://files.cnblogs.com/files/s313139232/pdfmake.min.js 程式碼也很簡單: html檔案:
node.js運用Phantom.js爬取頁面生成pdf
工具是webstorm,按照下圖引進phantom模組,其他開發工具請自行百度其他方法引入。 注意:當後臺放在Linux下,Linux需要安裝有相應的字型,否則中文列印生成pdf 程式碼: function test(){ var phantom = req
js根據日期等生成時間戳
遇到了根據年月日 時分秒來生成時間戳,基本保證了每次生成的圖片名字都不一樣 1.這種方法後面時間戳的格式是。比如2016年8月19日,11時10分3秒,生成的就是:20160819111003,程式碼如下: <!DOCTYPE html> <html la
jsp生成pdf(html2canvas.js使用)
前段時間有個電子簽章的需求,需要將jsp頁面內容生成pdf檔案,然後傳給電子簽章。自己嘗試過集中方法,有的整合麻煩,需要引入報表。再就是速度慢,流程很長,不適用於高併發。這裡整理了一個了很簡單靈活的方法,而且很方便理解。程式碼思路:jsp頁面通過html2canvas.js來
node.js 根據時間戳生成惟一識別符號、隨機生成唯一識別符號
根據時間戳生成惟一識別符號、隨機生成唯一識別符號 npm install node-uuid //根據時間戳生成惟一識別符號 console.log(uuid.v1()) //隨機生成唯一識別符號 console.log(uuid.v4())
js根據json物件陣列動態生成表格
需求:(1).ajax取得json物件陣列後,根據陣列內所有json物件的所有key和value生成相應的表格標題和表格資料; (2).不顯示json資料的某些key; (3).對某些key進行先後排序顯示。 2.js程式碼: (function
生成PDF的幾種方式
pdf、php、web、js、wkhtmltox1、後臺生成PDFthinkphp利用MPDF插件示例代碼:public function pdf(){ //引入類庫 Vendor(‘mpdf.mpdf‘); //設置中文編碼 $mpdf=new \mPDF(‘zh-cn‘,‘A4‘,
JS選取DOM元素的方法
net ie8 引用 css2 title 使用方法 區別 創建 firefox 摘自JavaScript權威指南(jQuery根據樣式選擇器查找元素的終極方式是 先用getElementsByTagName(*)獲取所有DOM元素,然後根據樣式選擇器對所有DOM元素進行篩
5月25日-js操作DOM遍歷子節點
bsp 單選 function nbsp 選擇 ngs pan alert find() 一、遍歷節點 遍歷子節點 children();//獲取節點的所有直接子類 遍歷同輩節點 next(); prev()
jQuery對象與JS原生dom對象之間的轉換
jquery jQuery就是JS的一個擴展庫,工具庫,提供很多方便快捷的方法,所以將JS對象轉換為jQuery對象後,能更方便地操作這個對象。但是jQuery對象也不是萬能的,有一些JS對象有的能,jQuery對象並沒有提供,所以需要轉換回JS對象,才能進行操作。另外一種情況可能是,你使用某些第三方庫,接口
ST MCU生成PDF+文件壓縮解壓
需要 ren aud 文件 無奈 .com 導致 壓縮解壓 str 之前碰到過,STM32F407上做文件壓縮,無奈壓縮文件時,哈夫曼編碼需要耗費很大的RAM,導致失敗。後來在論壇壇主的幫助下,了解了LZ77壓縮。 今天看論壇的時候,了解到MCU上,用pdflib庫,可以做
java生成pdf
根據 att ioe ins ntc spa 修改 tle 項目 最近項目需要根據客戶填寫的信息,依照模板生成一個pdf文件。 要是格式是固定的類型,可以使用Adobe Acrobat DC將模板的pdf文件轉化成可以編輯的類型,然後根據編輯時候取的變量名字一一將數