精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

教你兩招,輕松搞定Html頁(yè)面導(dǎo)出為Pdf文件

網(wǎng)絡(luò) 通信技術(shù)
本文主要介紹了如何將html頁(yè)面導(dǎo)出為pdf文件,希望給遇到類似需求的小伙伴一點(diǎn)思路,以后說(shuō)不定用得到。

[[398656]]

本文轉(zhuǎn)載自微信公眾號(hào)「愛寫B(tài)ug的麥洛」,作者麥洛。轉(zhuǎn)載本文請(qǐng)聯(lián)系愛寫B(tài)ug的麥洛公眾號(hào)。

Hi,大家好,我是麥洛,最近項(xiàng)目中遇到了將html頁(yè)面導(dǎo)出為pdf文件,現(xiàn)在將相關(guān)內(nèi)容分享出來(lái),希望幫到有需要的伙伴

需求場(chǎng)景

在招投標(biāo)軟件中,每個(gè)標(biāo)段結(jié)束評(píng)標(biāo)之后,都會(huì)生成評(píng)標(biāo)報(bào)告

評(píng)標(biāo)報(bào)告主要包含項(xiàng)目信息,標(biāo)段信息,投標(biāo)人信息,投標(biāo)人報(bào)價(jià),評(píng)標(biāo)專家打分等情況,相對(duì)來(lái)說(shuō)信息量還是比較大,假如我們要導(dǎo)出評(píng)標(biāo)報(bào)告該如何做?

  • html頁(yè)面直接導(dǎo)出為pdf
  • 后端組裝頁(yè)面,導(dǎo)出pdf

對(duì)比兩種方式,很明顯第一種方式優(yōu)越性更好。即方便實(shí)現(xiàn),又避免了由于頁(yè)面的變動(dòng)而需要改動(dòng)導(dǎo)出功能代碼的尷尬

方案調(diào)研

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

  • wkhtmltopdf
  • iText
  • html2canvas+jsPDF

其中前面兩種為后端實(shí)現(xiàn)方式,第三種為純前端實(shí)現(xiàn)方式;

首先讓我們來(lái)看一下wkhtmltopdf

從github上可以看出,wkhtmltopdf的Star數(shù)量總共有11.1K,由此可見他的火爆程度。經(jīng)過(guò)測(cè)驗(yàn)以后,我發(fā)現(xiàn)他的效果也是最好的。但是由于我們的項(xiàng)目采用了vue,貌似它不支持vue語(yǔ)法。所以我這邊最后只能退而求其次,使用了其他技術(shù)來(lái)實(shí)現(xiàn)。

接著我們來(lái)看一下html2canvas+jsPDF的方式

這種方式是采用以上兩個(gè)開源項(xiàng)目來(lái)實(shí)現(xiàn)。網(wǎng)上把它稱作是一種曲線救國(guó)的方式。首先我們利用html2canvas將HTML網(wǎng)頁(yè)保存成canvas圖片,然后我們?cè)诶胘sPDF將canvas圖片生成PDF文件。所以最終我們拿到的PDF文件并不是真正意義上的PDF文件,而是一張圖片。這也導(dǎo)致我們無(wú)法編輯PDF文件。而且質(zhì)量也一般。

最后我們來(lái)看一看iText

itext7好像是最新版本,這種方式適合于維護(hù)PDF模板然后動(dòng)態(tài)添加內(nèi)容,有需要的小伙伴可以了解一下。

由于我們的項(xiàng)目前端是采用vue,經(jīng)過(guò)測(cè)試以后,我發(fā)現(xiàn)wkhtmltopdf好像并不支持Vue語(yǔ)法。也可能是我的使用方式不當(dāng)。歡迎小伙伴指正。而且itext7更多用于需要去維護(hù)PDF模板的場(chǎng)景,并不適合我本次的需求。所以我最終使用html2canvas+jsPDF的方式來(lái)實(shí)現(xiàn)。

實(shí)戰(zhàn)案例

html2canvas+jsPDF

現(xiàn)在,我們來(lái)看看html2canvas+jsPDF的實(shí)現(xiàn)方式

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

  1. //導(dǎo)出pdf文件[html2canvas&&jspdf結(jié)合方式] 
  2.        getPdf: function () { 
  3.            var that = this; 
  4.            //影藏不需要的按鈕 
  5.            that.buttonShow = !that.buttonShow; 
  6.            //不寫會(huì)報(bào)錯(cuò) 
  7.            window.jsPDF = window.jspdf.jsPDF; 
  8.            //將body的內(nèi)容保存為一個(gè)圖片 
  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.                    //一頁(yè)pdf顯示html頁(yè)面生成的canvas高度 
  16.                    var pageHeight = contentWidth / 592.28 * 841.89 
  17.                    //未生成pdf的html頁(yè)面高度 
  18.                    var leftHeight = contentHeight 
  19.                    //頁(yè)面偏移 
  20.                    var position = 0 
  21.                    //a4紙的尺寸[595.28,841.89] html頁(yè)面生成的canvas在pdf的寬高 
  22.                    var imgWidth = 595.28 
  23.                    var imgHeight = 592.28 / contentWidth * contentHeight 
  24.                    //獲取圖片的base64數(shù)據(jù) 
  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.                        //分頁(yè) 
  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+"評(píng)標(biāo)報(bào)告" + '.pdf'); 
  43.                    //將pdf文件轉(zhuǎn)為blob對(duì)象 
  44.                    var blob = save.output("blob"); 
  45.                    //保存pdf文件到服務(wù)器 
  46.                    that.savePdf(blob) 
  47.                }, 
  48.            }); 
  49.        }, 

由于這種方式是純前端實(shí)現(xiàn)。如果我們想要把PDF保存一份到服務(wù)器,需要自己手動(dòng)實(shí)現(xiàn)將文件上傳到服務(wù)器。

wkhtmltopdf

接下來(lái)我們來(lái)看看wkhtmltopdf這種方式如何實(shí)現(xiàn)?

如果我們要使用wkhtmltopdf,需要安裝官方提供的軟件,大家可以在他的官網(wǎng)進(jìn)行下載。

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"

下面我們看一看如何使用,我們需要將我們導(dǎo)出的頁(yè)面的路徑拼接后作為參數(shù)傳遞進(jìn)來(lái)。

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

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

接下來(lái)我們看一看導(dǎo)出我的CSDN首頁(yè)的效果,還是很棒的

小結(jié)

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

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

 

責(zé)任編輯:武曉燕 來(lái)源: 愛寫B(tài)ug的麥洛
相關(guān)推薦

2009-08-07 12:12:00

C#讀取Excel文件

2019-09-09 11:35:21

GitHub工具瀏覽

2023-04-21 08:13:23

打印機(jī)堵頭程序

2009-11-10 09:11:46

2011-05-07 14:07:14

打印機(jī)后臺(tái)打印路徑

2017-11-14 10:44:29

電腦開機(jī)內(nèi)存

2009-02-01 09:42:00

2009-11-20 10:55:13

Oracle數(shù)據(jù)比較

2023-12-18 08:24:09

LinuxPythonWord

2010-08-31 11:06:44

共享打印機(jī)

2009-03-02 09:05:37

2018-05-23 16:56:40

戴爾

2024-12-06 11:38:12

2018-06-14 09:28:46

2023-10-09 22:44:51

調(diào)試代碼

2019-10-14 09:37:48

PC電腦PC軟件網(wǎng)頁(yè)

2011-08-11 16:44:46

網(wǎng)康ITM視頻會(huì)議

2025-03-07 09:10:00

網(wǎng)絡(luò)網(wǎng)絡(luò)通信路由

2018-06-28 15:58:04

PDF

2011-02-22 16:46:24

文件時(shí)光機(jī)金山T盤金山網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品女同一区二区三区在线播放| 国产98色在线|日韩| 一区二区成人av| 国产精品视频分类| 欧美人与禽性xxxxx杂性| 99久久久久免费精品国产 | 日韩国产一区久久| 在线播放精品视频| 影音先锋在线一区| 中文字幕日韩高清| 四季av综合网站| 欧美三级电影网址| 欧美午夜激情小视频| 宅男噜噜99国产精品观看免费| 国精品人妻无码一区二区三区喝尿| 香蕉亚洲视频| 欧美日本亚洲视频| 亚洲天堂av中文字幕| 久久精品色综合| 欧美日韩激情一区二区三区| 黄色片网址在线观看| 日本视频在线免费观看| 91美女蜜桃在线| 97人人干人人| 在线观看亚洲一区二区| 国产精品久久久免费 | av午夜在线观看| 国产精品美女一区二区| 久久av免费观看| 亚洲av无码国产精品久久不卡| 青青草伊人久久| 97超碰国产精品女人人人爽 | 小处雏高清一区二区三区| 亚洲精品一区二三区不卡| 久久久久亚洲av无码专区首jn| 91成人在线| 日本高清成人免费播放| 国产午夜福利100集发布| 二区三区四区高清视频在线观看| 国产三级一区二区三区| 久久免费一区| 天天综合网在线| 床上的激情91.| 亚洲最大成人免费视频| 国产尤物在线观看| 蜜桃一区二区三区在线观看| 日韩免费观看在线观看| 免费黄色网址在线| 亚洲麻豆av| 97免费在线视频| 日韩av在线播| 国产日韩欧美三级| 97av在线视频| 一本一道无码中文字幕精品热| 日韩午夜在线电影| 午夜伦理精品一区| 国产又大又黑又粗免费视频| 在线成人欧美| 91国语精品自产拍在线观看性色 | 欧美性淫爽ww久久久久无| 69堂免费视频| 午夜精品成人av| 欧洲精品一区二区| 日韩一级理论片| 成人午夜一级| 欧美日韩亚洲不卡| 91精产国品一二三产区别沈先生| 亚洲精品无播放器在线播放| 欧美一区二区三区精品| 无码人妻一区二区三区精品视频| 成人直播在线观看| 精品中文视频在线| 卡一卡二卡三在线观看| 久久亚洲在线| 欧美成人高清视频| 久草视频精品在线| 亚洲中午字幕| 国产精品视频一| 国产乱子伦精品无码码专区| 国产东北露脸精品视频| 精品国产中文字幕| 91社区在线| 亚洲精品免费电影| 人妻久久久一区二区三区| 欧美电影网站| 91精品午夜视频| 污污免费在线观看| 精品国产91乱码一区二区三区四区 | 久久久久xxxx| 91精品国产自产精品男人的天堂| 日韩电影在线观看中文字幕| jizz18女人高潮| 欧美1级日本1级| 日本欧美国产在线| 国产精品探花视频| 9久草视频在线视频精品| 日韩精品久久一区| 色呦呦在线资源| 色999日韩国产欧美一区二区| 亚洲第一天堂久久| 亚洲成aⅴ人片久久青草影院| 精品国产拍在线观看| 在线观看 中文字幕| 麻豆国产精品官网| 国产欧美精品一区二区三区| 成人精品一区二区| 亚洲成av人片一区二区三区| 国产福利在线免费| 欧美电影免费网站| 久久精品国产亚洲精品| 国产又大又黄视频| 狠狠色狠狠色综合| 欧美日韩三区四区| 神马午夜伦理不卡| 欧美视频在线观看一区| 一起草在线视频| 欧美一区视频| 成人欧美一区二区三区在线湿哒哒| 污污视频在线观看网站| 亚洲猫色日本管| 中文字幕第100页| 蜜桃国内精品久久久久软件9| 久久91精品国产91久久跳| 国模私拍一区二区| 久久天堂av综合合色蜜桃网| 成人区一区二区| 精品99re| 久久影院模特热| 一区二区三区在线免费观看视频 | 貂蝉被到爽流白浆在线观看| 国产欧美高清| 国内精品二区| 啦啦啦中文在线观看日本| 在线成人午夜影院| 国产第一页精品| 爽爽淫人综合网网站| 久久久久高清| 国产传媒在线观看| 欧美电视剧在线看免费| 精品国产欧美日韩不卡在线观看| 美女一区二区久久| 日本公妇乱淫免费视频一区三区| 蜜桃视频在线观看免费视频| 亚洲成人免费网站| 国产性猛交普通话对白| 国产丶欧美丶日本不卡视频| 2021狠狠干| 亚洲免费一区三区| 欧美高清自拍一区| 丰满少妇在线观看bd| 亚洲午夜精品网| 亚洲一区二区三区黄色| 黄色另类av| 精品视频导航| 伊人久久国产| 亚洲视频在线视频| wwwwww在线观看| 国产精品卡一卡二| 青娱乐精品在线| 亚洲视频精品| 精品乱子伦一区二区三区| 粉嫩一区二区| 日韩在线观看免费网站| 99国产在线播放| 亚洲国产视频在线| 97人妻精品一区二区三区免 | 亚洲国产综合91精品麻豆| 香蕉视频在线观看黄| 亚洲国产激情| 日韩国产精品一区二区| 99综合99| 性欧美视频videos6一9| 久久av少妇| 欧美放荡的少妇| 精品无码久久久久久久久| 91在线国内视频| 亚洲欧美另类动漫| 亚洲最新色图| 精品中文字幕人| 成人福利一区二区| 欧美高清videos高潮hd| 深夜福利视频一区| 欧美日本韩国一区| 日本少妇全体裸体洗澡| 欧美极品xxx| 免费黄色av网址| 日韩高清不卡一区二区三区| 国产经典久久久| 美女少妇全过程你懂的久久| 91沈先生在线观看| 深夜av在线| 久久久久北条麻妃免费看| 亚洲精品一区二区三区区别| 色狠狠桃花综合| 激情综合五月网| 欧美激情一区在线| 人妻 日韩 欧美 综合 制服| 美女一区二区视频| 777精品久无码人妻蜜桃| 91麻豆精品国产91久久久平台| 国产一区二区三区四区五区加勒比| 在线看欧美视频| 欧美激情综合色| 日本在线人成| 亚洲免费视频网站| 国产黄色片网站| 欧美三级电影网站| 国产精品999在线观看| 一区二区三区四区中文字幕| 国产调教在线观看| 97久久人人超碰| 亚洲五月激情网| 奇米影视一区二区三区| 波多野结衣综合网| 欧美日韩视频一区二区三区| 亚洲欧洲一二三| 竹菊久久久久久久| 成人黄色片视频网站| 天天综合在线观看| 国产成人精品午夜| 亚洲涩涩在线| 久久久久久久91| 亚洲性图自拍| 久久精品国产久精国产一老狼| 欧美成人免费| 亚洲精品乱码久久久久久金桔影视| 国产精品一级视频| 欧美日韩一级黄| 成人免费一级片| 黄色一区二区在线| 中文字幕一区二区三区手机版| 亚洲卡通动漫在线| 国产成人av免费在线观看| 国产欧美一区二区三区网站| 国产男女猛烈无遮挡a片漫画| 国产999精品久久| 无码人妻aⅴ一区二区三区玉蒲团| 久久精品国产一区二区| 污版视频在线观看| 日本在线不卡视频一二三区| 精品久久久久久久免费人妻| 久久av在线| 欧美 日韩精品| 免费精品视频| 99999精品视频| 久久av一区| 好男人www社区| 日韩成人av影视| 免费看污污网站| 久久电影网站中文字幕 | 成人国产精品视频| 欧美日韩一区二区三区四区五区六区| 国产乱对白刺激视频不卡| 51自拍视频在线观看| 国产精品18久久久久| 成年人性生活视频| 成人动漫一区二区在线| chinese麻豆新拍video| 久久中文字幕电影| 女女互磨互喷水高潮les呻吟| 国产日产亚洲精品系列| 日本伦理一区二区三区| 亚洲日本欧美天堂| 久草网在线观看| 精品国产户外野外| 中文人妻av久久人妻18| 欧美乱妇15p| 精品人妻一区二区三区换脸明星| 精品国产电影一区二区| 偷拍25位美女撒尿视频在线观看| 亚洲天堂免费在线| 久草中文在线| 久久免费高清视频| 成人免费网站视频| 国产欧洲精品视频| jizz18欧美18| 日本中文不卡| 亚洲色图88| 日韩av片在线看| 麻豆精品国产91久久久久久| 成年人性生活视频| 久久人人爽人人爽| 中日韩一级黄色片| 香蕉加勒比综合久久| 中文字幕乱伦视频| 欧美成人性战久久| 精品福利视频导航大全| 久久国产精品久久久久久久久久 | 欧美日韩美女视频| 伊人网免费视频| 欧美精品一区二区高清在线观看| 国产美女视频一区二区三区| 欧美成人sm免费视频| 韩国成人动漫| 亚洲xxx视频| 国产精品一区高清| 欧美在线观看视频免费| 日韩激情一二三区| 久久久久国产免费| 国产精品入口麻豆九色| www成人在线| 日韩视频免费直播| 岛国在线视频免费看| 欧美国产乱视频| 国产精品99久久久久久董美香| 国产精品青青草| 久久精品亚洲欧美日韩精品中文字幕| 国产午夜大地久久| 国产精品自拍av| 色噜噜噜噜噜噜| 欧美日韩在线免费观看| 国产精品一级二级| 中文字幕日韩电影| 欧美日韩美女| 精品免费国产| 影音先锋久久| 无码人妻久久一区二区三区蜜桃| 国产精品久久免费看| 国产又大又粗又爽| 亚洲精品国产精品乱码不99按摩 | 99久久精品免费看国产四区| 不卡av一区二区| 男人揉女人奶房视频60分| 丰满放荡岳乱妇91ww| 91视频青青草| 欧美精品一二三区| eeuss影院www在线观看| 欧洲美女7788成人免费视频| 成人福利一区| 九九热只有这里有精品| 国产成人福利片| 精品99久久久久成人网站免费| 欧美久久久影院| 国产高清自拍视频在线观看| 国产91精品高潮白浆喷水| 麻豆一区二区| 成人性免费视频| 丁香五精品蜜臀久久久久99网站| 免费看特级毛片| 91精品免费观看| 成人看片免费| 成人精品一区二区三区电影黑人 | 欧美一级片免费播放| 国产99久久久国产精品潘金网站| 亚洲色婷婷一区二区三区| 91精品免费观看| 欧洲中文在线| 国产伦精品一区二区三| 99精品视频免费观看视频| 国产精品手机在线观看| 精品国产乱码久久久久久天美| 天天爱天天干天天操| 欧洲午夜精品久久久| 女人丝袜激情亚洲| 老司机午夜av| 国产精品美女久久久久高潮| 国产乱叫456在线| 欧美激情视频网址| 国产精品欧美大片| 国产91在线免费| 国产日产欧美一区| 中文文字幕一区二区三三| 久久精品国产91精品亚洲| 日本一区二区三区视频在线看 | 亚洲国产精品久久久久婷婷老年| 久久国产精品免费| 久草免费在线观看视频| 日韩成人中文字幕| 日本一区免费网站| 亚洲欧美一二三| www.亚洲免费av| 午夜视频网站在线观看| 久久久91精品| 国产在线播放精品| 亚洲性生活网站| 亚洲女与黑人做爰| 亚洲av成人无码久久精品老人| 国产精品第七影院| 女同性一区二区三区人了人一 | 欧美激情在线精品一区二区三区| 人人干人人干人人| 亚洲一区二区三区国产| 精品电影在线| 91精品天堂| 久久久精品性| 欧美成人黄色网| 亚洲热线99精品视频| 日韩在线观看中文字幕| 无码aⅴ精品一区二区三区浪潮| 国产精品丝袜91| 亚洲免费一级片| 国产精品永久免费在线| 在线亚洲伦理| 午夜剧场免费在线观看| 亚洲欧美日韩一区二区在线| 欧州一区二区三区| 成人中文字幕av| 亚洲国产日韩a在线播放性色| 95在线视频| 久久av免费观看|