如何使用html2pdf.js生成pdf文件詳解
需求場景
1. vue2 + elment ui + echarts
2. 生成pdf需要 隱式處理(不需要用戶操作)
3. pdf數(shù)據(jù)量過多需要分頁,處理頁眉頁腳
4. 頁面由多個組件組成,數(shù)據(jù)量過大需要全部渲染完再進(jìn)行pdf生成
需求實(shí)現(xiàn)
1. 技術(shù)棧:通過html2pdf.js直接轉(zhuǎn)pdf,不需要通過html2canvas和pdf.js進(jìn)行二次操作
2. mounted里面再進(jìn)行定時器調(diào)用生成 pdf 方法做到隱式生成
html2pdf.js
html2pdf就是html2canvas和pdf的集成,具體配置項(xiàng)可以看這個配置項(xiàng)文檔,看不懂英文可以點(diǎn)擊瀏覽器自帶翻譯成中文。

html2pdf.js使用
- 第一步:下載html2pdf.js
npm install --save html2pdf.js 或者 yarn add html2pdf.js
- 第二步:引入項(xiàng)目
import html2pdf from 'html2pdf.js'
- 部分方法解釋,具體配置項(xiàng)可查看配置項(xiàng)文檔
downloadPDF() {
console.log('生成pdf')
const element = document.getElementById('report') // 獲取報(bào)告的DOM元素
// 設(shè)置打印選項(xiàng)
const options = {
margin: 1, // 內(nèi)邊距
filename: '評估報(bào)告.pdf', // pdf文件名字
image: { type: 'jpeg', quality: 0.98 }, // 生成圖片的類型以及清晰度
pagebreak: { mode: 'avoid-all', before: '#page2el' }, // 處理是否元素分割
//元素分割:就是分頁的時候,會將圖表、文字等元素分割成倆塊,這里avoid-all是所有元素都不被分割
html2canvas: { scale: 2 },
jsPDF: { unit: 'cm', format: 'a4', orientation: 'portrait' }
}
// 生成PDF
html2pdf()
.from(element)
.set(options)
.output('blob') // 將輸出設(shè)置為Blob
.then((blob) => {
// 創(chuàng)建一個鏈接元素
console.log('blob :>> ', blob)
const url = URL.createObjectURL(blob)
try {
let file = this.transBlobFilrToFile(blob)
console.log('file :>> ', file)
// 這里可以將文件進(jìn)行處理,上傳pdf到服務(wù)器
} catch (e) {
console.log(e)
}
})
},
全部代碼
<div class="afour" id="report" @load="downloadPDF">
<div class="afour_header" style="width: 100%;display: flex;flex-direction: column;">
<div class="afour_header_span" style="display: flex;justify-content: space-between;">
<p class="afour_header_p" style="
margin: 5px;
display: flex;
justify-content: center;
text-align: center;
font-size: 24px;
box-sizing: border-box;
flex: 1;">
評估報(bào)告
</p>
<el-divider></el-divider>
</div>
<!--都是一些圖表和echarts組件 通過綁定的 Data 進(jìn)行傳值-->
<basic-vue :basicData='basicData' class="no-break"></basic-vue>
<now-assessment-vue :nowData='nowData' class="no-break"></now-assessment-vue>
<health-item-vue :healthData='healthData' class="no-break"></health-item-vue>
<table-com-vue :tableData="waijianTableData" class="no-break"></table-com-vue>
<table-com-vue :tableData="yiconxingTableData" class="no-break"></table-com-vue>
<notice-text-vue :textData='textData' class="no-break"></notice-text-vue>
<notice-text-vue :textData='noticeTextData' class="no-break"></notice-text-vue>
<div class="footer">頁腳---------------------</div>
</div>
<script>
import html2pdf from 'html2pdf.js'
import basicVue from './reportCom/basic.vue'
import healthItemVue from './reportCom/health-item.vue'
import nowAssessmentVue from './reportCom/now-assessment.vue'
import tableComVue from './reportCom/table-com.vue'
import noticeTextVue from './reportCom/notice-text.vue'
export default {
name:"",
components: { basicVue, nowAssessmentVue, healthItemVue, tableComVue, noticeTextVue },
data() {
return {
basicData: {},
nowData: {},
healthData: [],
waijianTableData: {},
yiconxingTableData: {},
textData: {},
noticeTextData: {},
},
methods:{
-------
//其他方法
-------
downloadPDF() {
console.log('生成pdf')
const element = document.getElementById('report') // 獲取報(bào)告的DOM元素
// 設(shè)置打印選項(xiàng)
const options = {
margin: 1, // 內(nèi)邊距
filename: '評估報(bào)告.pdf', // pdf文件名字
image: { type: 'jpeg', quality: 0.98 }, // 生成圖片的類型以及清晰度
pagebreak: { mode: 'avoid-all', before: '#page2el' }, // 處理是否元素分割
//元素分割:就是分頁的時候,會將圖表、文字等元素分割成倆塊,這里avoid-all是所有元素都不被分割
html2canvas: { scale: 2 },
jsPDF: { unit: 'cm', format: 'a4', orientation: 'portrait' }
}
// 生成PDF
html2pdf()
.from(element)
.set(options)
.output('blob') // 將輸出設(shè)置為Blob
.then((blob) => {
// 創(chuàng)建一個鏈接元素
console.log('blob :>> ', blob)
const url = URL.createObjectURL(blob)
try {
let file = this.transBlobFilrToFile(blob)
console.log('file :>> ', file)
// 這里可以將文件進(jìn)行處理,上傳pdf到服務(wù)器
} catch (e) {
console.log(e)
}
})
},
}
mounted() {
setTimeout(()=>{
this.downloadPDF()
}.500)
},
},
}
</script>
問題
- mounted處理需要是從別的頁面跳轉(zhuǎn)過來這個頁面才可以生效,那如果是在原基礎(chǔ)頁面彈窗出這個頁面,怎么樣才能保險生成pdf呢?求告知~
總結(jié)
到此這篇關(guān)于如何使用html2pdf.js生成pdf文件的文章就介紹到這了,更多相關(guān)html2pdf.js生成pdf文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過action傳過來的值在option獲取進(jìn)行驗(yàn)證的方法
通過action傳過來的值在option獲取進(jìn)行驗(yàn)證,下面有個不錯的示例,需要的朋友不要錯過2013-11-11
JavaScript針對SPA應(yīng)用的前端優(yōu)化策略概述
前端性能優(yōu)化是Web開發(fā)中非常重要的一環(huán),優(yōu)化能夠有效地提高網(wǎng)站的加載速度和用戶體驗(yàn),而對于SPA來說,由于其特殊的加載方式和數(shù)據(jù)交互方式,其優(yōu)化策略也具有一定的特殊性,需要詳細(xì)了解可以參考下文2023-05-05
firefox事件處理之自動查找event的函數(shù)(用于onclick=foo())
在ie中,事件對象是作為一個全局變量來保存和維護(hù)的。 所有的瀏覽器事件,不管是用戶觸發(fā)的,還是其他事件, 都會更新window.event 對象。2010-08-08
uniapp手機(jī)號一鍵登錄實(shí)現(xiàn)保姆級教程(含前端和后端)
這篇文章主要介紹了uniapp手機(jī)號一鍵登錄實(shí)現(xiàn)的相關(guān)資料,本文指導(dǎo)如何創(chuàng)建uniapp項(xiàng)目、關(guān)聯(lián)uniCloud云空間,并配置一鍵登錄功能,,整個過程涉及創(chuàng)建云開發(fā)環(huán)境、關(guān)聯(lián)云服務(wù)空間、配置登錄服務(wù)和編寫云函數(shù),需要的朋友可以參考下2024-10-10
js重寫alert事件(避免alert彈框標(biāo)題出現(xiàn)網(wǎng)址)
這篇文章主要給大家介紹了關(guān)于js重寫alert事件的相關(guān)資料,這樣可以避免alert彈框標(biāo)題出現(xiàn)網(wǎng)址的情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
JavaScript如何將數(shù)據(jù)處理成樹形結(jié)構(gòu)
這篇文章主要介紹了JavaScript如何將數(shù)據(jù)處理成樹形結(jié)構(gòu)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
JS生態(tài)系統(tǒng)加速npm腳本優(yōu)化及性能分析探索
這篇文章主要為大家介紹了JS生態(tài)系統(tǒng)加速npm腳本優(yōu)化及性能分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

