最近的項目中需要顯示pdf內容、下載pdf、甚至是前端生成pdf
適用於angular2、4或者更高版本
情景1.需要將頁面的某個部分轉成pdf文件並下載(即將頁面的部分html內容轉成pdf文件)
方案:
1.首先借助 html-to-image 將所需html內容轉成圖片,即
domtoimage.toJpeg(dom,params)
2.借助jspdf將圖片轉換成pdf,即pdf.addImage()這個方法,
然而這里有個坑!!!前端這里顯示圖片的單位是px,但是生成的pdf是按mm來計算的,像A4紙尺寸是210mm×297mm,所以這里需要做像素與毫米的轉換 ,否則生成的pdf里的圖片不清晰
轉換還需要知道另一個參數:DPI(每英寸多少點),一般來說300DPI足夠
一般來說 300DPI就足夠了
象素數 / DPI = 英寸數
英寸數 * 25.4 = 毫米數,所以這里就需要你根據實際情況 計算出你這個圖片的長寬 包括里面的字的大小
3.將pdf下載到用戶本地,即 pdf.save(name),可指定文件名
實際代碼如下:
let hideNode = document.getElementById(id).cloneNode(true); document.getElementById(id).parentElement.appendChild(hideNode); this.render.addClass(hideNode,'consulting-report-download'); domtoimage.toJpeg(hideNode, { quality: 1.0, bgcolor:'#fff', style: { 'opacity':'1', 'top':'0', 'left': '0' } }) .then(function (dataUrl) { let img = new Image(); img.src = dataUrl; img.onload = function() { let pdf = new jsPDF(); pdf.addImage(dataUrl, 'JPEG', 14, 10, img.width/12, img.height/12 );//300DPI 1mm=12px pdf.save(`${name}.pdf`); } }) .then(()=>{ this.downReport = false; });
情景2.需要將pdf文件的內容顯示在網頁上
方案:
這里又分兩種情況 ,
一種是后端直接給你一個pdf文件的鏈接,如
<pdf-viewer [src]="pdfSrc" [page]="page" [original-size]="true" style="display: block;" ></pdf-viewer>
src就是后端給你的鏈接,page就是頁數,還需要配置別的可以去github看看,這個pad-viewer是按將pdf豎向順序顯示,剛好符合產品的需求,所以這里我沒有深入
還有一種情況是 用戶直接上傳pdf,然后需要將用戶上傳的pdf的內容顯示在網頁上
這里就需要用到HTML5 里面的 FileReader獲取pdfSrc,
然后還是用到上面的<pdf-viewer>
let $img: any = document.querySelector('#file'); if (typeof (FileReader) !== 'undefined') { let reader = new FileReader(); reader.onload = (e: any) => { this.pdfSrc = e.target.result; }; reader.readAsArrayBuffer($img.files[0]); }
情景3.直接下載pdf文件
方案:
1.window.open(url)
2.location.href = url
說實話,感覺有點low,如果您有更好的方案,希望可以互相交流
關於angular2及以上操作pdf的3種需求及解決方案,如果還有別的需求和更好的方案,歡迎交流~