成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教你兩招,輕松搞定Html頁面導出為Pdf文件

網絡 通信技術
本文主要介紹了如何將html頁面導出為pdf文件,希望給遇到類似需求的小伙伴一點思路,以后說不定用得到。

[[398656]]

本文轉載自微信公眾號「愛寫Bug的麥洛」,作者麥洛。轉載本文請聯系愛寫Bug的麥洛公眾號。

Hi,大家好,我是麥洛,最近項目中遇到了將html頁面導出為pdf文件,現在將相關內容分享出來,希望幫到有需要的伙伴

需求場景

在招投標軟件中,每個標段結束評標之后,都會生成評標報告

評標報告主要包含項目信息,標段信息,投標人信息,投標人報價,評標專家打分等情況,相對來說信息量還是比較大,假如我們要導出評標報告該如何做?

  • html頁面直接導出為pdf
  • 后端組裝頁面,導出pdf

對比兩種方式,很明顯第一種方式優越性更好。即方便實現,又避免了由于頁面的變動而需要改動導出功能代碼的尷尬

方案調研

查閱了一些資料,目前市面上流行的解決方案主要有以下幾種

  • wkhtmltopdf
  • iText
  • html2canvas+jsPDF

其中前面兩種為后端實現方式,第三種為純前端實現方式;

首先讓我們來看一下wkhtmltopdf

從github上可以看出,wkhtmltopdf的Star數量總共有11.1K,由此可見他的火爆程度。經過測驗以后,我發現他的效果也是最好的。但是由于我們的項目采用了vue,貌似它不支持vue語法。所以我這邊最后只能退而求其次,使用了其他技術來實現。

接著我們來看一下html2canvas+jsPDF的方式

這種方式是采用以上兩個開源項目來實現。網上把它稱作是一種曲線救國的方式。首先我們利用html2canvas將HTML網頁保存成canvas圖片,然后我們在利用jsPDF將canvas圖片生成PDF文件。所以最終我們拿到的PDF文件并不是真正意義上的PDF文件,而是一張圖片。這也導致我們無法編輯PDF文件。而且質量也一般。

最后我們來看一看iText

itext7好像是最新版本,這種方式適合于維護PDF模板然后動態添加內容,有需要的小伙伴可以了解一下。

由于我們的項目前端是采用vue,經過測試以后,我發現wkhtmltopdf好像并不支持Vue語法。也可能是我的使用方式不當。歡迎小伙伴指正。而且itext7更多用于需要去維護PDF模板的場景,并不適合我本次的需求。所以我最終使用html2canvas+jsPDF的方式來實現。

實戰案例

html2canvas+jsPDF

現在,我們來看看html2canvas+jsPDF的實現方式

首先需要引入html2canvas和jsPDF的依賴文件。大家可以從官網下載。我也會在文末的資源包中放一份,方便大家使用。

  1. //導出pdf文件[html2canvas&&jspdf結合方式] 
  2.        getPdf: function () { 
  3.            var that = this; 
  4.            //影藏不需要的按鈕 
  5.            that.buttonShow = !that.buttonShow; 
  6.            //不寫會報錯 
  7.            window.jsPDF = window.jspdf.jsPDF; 
  8.            //將body的內容保存為一個圖片 
  9.            var html2canvas1 = html2canvas(document.body, { 
  10.                //圖片跨域加載 
  11.                useCORS: true
  12.                onrendered: function (canvas) { 
  13.                    var contentWidth = canvas.width 
  14.                    var contentHeight = canvas.height 
  15.                    //一頁pdf顯示html頁面生成的canvas高度 
  16.                    var pageHeight = contentWidth / 592.28 * 841.89 
  17.                    //未生成pdf的html頁面高度 
  18.                    var leftHeight = contentHeight 
  19.                    //頁面偏移 
  20.                    var position = 0 
  21.                    //a4紙的尺寸[595.28,841.89] html頁面生成的canvas在pdf的寬高 
  22.                    var imgWidth = 595.28 
  23.                    var imgHeight = 592.28 / contentWidth * contentHeight 
  24.                    //獲取圖片的base64數據 
  25.                    var pageData = canvas.toDataURL('image/jpeg', 1.0) 
  26.                    //document.body.appendChild(canvas); 
  27.                    var PDF = new jsPDF('''pt''a4'); 
  28.                    if (leftHeight < pageHeight) { 
  29.                        PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight) 
  30.                    } else { 
  31.                        //分頁 
  32.                        while (leftHeight > 0) { 
  33.                            PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight) 
  34.                            leftHeight -= pageHeight 
  35.                            position -= 841.89 
  36.                            if (leftHeight > 0) { 
  37.                                PDF.addPage() 
  38.                            } 
  39.                        } 
  40.                    } 
  41.                    //下載pdf 
  42.                    var save = PDF.save(that.sectionInfo.sectionName+"評標報告" + '.pdf'); 
  43.                    //將pdf文件轉為blob對象 
  44.                    var blob = save.output("blob"); 
  45.                    //保存pdf文件到服務器 
  46.                    that.savePdf(blob) 
  47.                }, 
  48.            }); 
  49.        }, 

由于這種方式是純前端實現。如果我們想要把PDF保存一份到服務器,需要自己手動實現將文件上傳到服務器。

wkhtmltopdf

接下來我們來看看wkhtmltopdf這種方式如何實現?

如果我們要使用wkhtmltopdf,需要安裝官方提供的軟件,大家可以在他的官網進行下載。

https://wkhtmltopdf.org/downloads.html

安裝完成以后我們需要將安裝路徑配置的我們的工具類中。

  1. public class WKHtmlToPdfUtil { 
  2.     private static final String WINDOWS_URL = "D:/wkhtmltopdf/bin/wkhtmltopdf.exe"
  3.     private static final String LINUX_URL = "/opt/wkhtmltox/bin/wkhtmltopdf"

下面我們看一看如何使用,我們需要將我們導出的頁面的路徑拼接后作為參數傳遞進來。

  1. String serverUrl = request.getScheme() + "://" + request.getServerName()+":"+request.getServerPort(); 
  2.        //組裝需要導出頁面的地址 
  3.        serverUrl += request.getContextPath()+"/"
  4.            serverUrl += "evaluate/report/evaluateSectionReport?projectId="+projectId+"&sectionId="+sectionId; 
  5.            logger.info(serverUrl); 
  6.         // 工具類調用 
  7.        exportPdf(serverUrl,response); 
  1. /** 
  2.     * @Title: 導出pdf到服務器 
  3.     * @param 
  4.     * @return 
  5.     */ 
  6.    public static void exportPdf(String serverUrl, HttpServletResponse response){ 
  7.        try { 
  8.            ArrayList<String> urlList = new ArrayList<>(); 
  9.            urlList.add(serverUrl); 
  10.            String folder = Global.getProfile() + "resultReports/"
  11.            // 判斷此路徑所有目錄是否存在,不存在則創建 
  12.            File file = new File(folder); 
  13.            if(!file.exists() && !file.isDirectory()){ 
  14.                // mkdir()創建此抽象路徑名指定的目錄。如果父目錄不存在則創建不成功 
  15.                // mkdirs()創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄 
  16.                file.mkdirs(); 
  17.            } 
  18.            // 生成隨機的附件路徑(時間戳+4位隨機數) 
  19.            Random random = new Random(); 
  20.            String fileName = "milolee"+random.nextInt(10); 
  21.            //資源包中,自己下載 
  22.            WKHtmlToPdfUtil.htmlToPdf(urlList, folder+fileName+".pdf"); 
  23.            //資源包中,自己下載 
  24.            // 生成成交通知書pdf文件到服務器之后下載到客戶端 
  25.            FileUtils.downLoadFile(folder,fileName+".pdf",response); 
  26.             
  27.        } catch (Exception e){ 
  28.            e.printStackTrace(); 
  29.        } 
  30.    } 

工具類WKHtmlToPdfUtil和FileUtils我放到資源包中,大家自行下載,太多了就不一一粘貼了

接下來我們看一看導出我的CSDN首頁的效果,還是很棒的

小結

本文主要介紹了如何將html頁面導出為pdf文件,希望給遇到類似需求的小伙伴一點思路,沒遇到的也可以收藏一下,以后說不定用得到。

由于本文設計到的代碼比較多,我會打包上傳到csdn,大家可以自行下載

 

責任編輯:武曉燕 來源: 愛寫Bug的麥洛
相關推薦

2009-08-07 12:12:00

C#讀取Excel文件

2019-09-09 11:35:21

GitHub工具瀏覽

2023-04-21 08:13:23

打印機堵頭程序

2009-11-10 09:11:46

2011-05-07 14:07:14

打印機后臺打印路徑

2017-11-14 10:44:29

電腦開機內存

2009-02-01 09:42:00

2023-12-18 08:24:09

LinuxPythonWord

2009-11-20 10:55:13

Oracle數據比較

2018-06-14 09:28:46

2023-10-09 22:44:51

調試代碼

2019-10-14 09:37:48

PC電腦PC軟件網頁

2010-08-31 11:06:44

共享打印機

2018-05-23 16:56:40

戴爾

2024-12-06 11:38:12

2009-03-02 09:05:37

2011-08-11 16:44:46

網康ITM視頻會議

2018-06-28 15:58:04

PDF

2025-03-07 09:10:00

網絡網絡通信路由

2011-02-22 16:46:24

文件時光機金山T盤金山網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 粉嫩高清一区二区三区 | 日韩欧美在线不卡 | 欧美成人激情 | 久久久精 | 久久夜视频 | 精品综合 | 欧美精品在线播放 | www.一级毛片 | 国产精品1区2区 | 久久久久久亚洲国产精品 | www.日韩| 在线婷婷 | 三级成人片| 午夜日韩视频 | 精品国产乱码久久久久久闺蜜 | 精品少妇一区二区三区日产乱码 | 九九精品久久久 | 日韩在线精品视频 | 精品欧美乱码久久久久久1区2区 | 久久婷婷色 | 国产精品久久亚洲 | www.久久久久久久久久久久 | 天堂在线免费视频 | 韩日av在线 | 亚洲国产成人久久综合一区,久久久国产99 | 毛片大全 | 在线欧美小视频 | 99久久免费精品视频 | 中文字幕1区 | 国产精品九九 | 欧美日韩高清在线一区 | 欧美一级二级三级 | 玖玖综合在线 | 日韩一二区 | 免费国产成人av | 日日骚av | 黑人巨大精品欧美一区二区免费 | 久久国 | 四虎影院在线观看av | 久久国内精品 | 狠狠天天 |