需求场景
| 1. vue2 + elment ui + echarts |
| 2. 生成pdf需要 隐式处理(不需要用户操作) |
| 3. pdf数据量过多需要分页,处理页眉页脚 |
| 4. 页面由多个组件组成,数据量过大需要全部渲染完再进行pdf生成 |
复制
需求实现
| 1. 技术栈:通过html2pdf.js直接转pdf,不需要通过html2canvas和pdf.js进行二次操作 |
| 2. mounted里面再进行定时器调用生成 pdf 方法做到隐式生成 |
复制
html2pdf.js
html2pdf就是html2canvas和pdf的集成,具体配置项可以看这个配置项文档,看不懂英文可以点击浏览器自带翻译成中文。

html2pdf.js使用
npm install --save html2pdf.js 或者 yarn add html2pdf.js
| import html2pdf from 'html2pdf.js' |
复制
| downloadPDF() { |
| console.log('生成pdf') |
| const element = document.getElementById('report') |
| |
| const options = { |
| margin: 1, |
| filename: '评估报告.pdf', |
| image: { type: 'jpeg', quality: 0.98 }, |
| pagebreak: { mode: 'avoid-all', before: '#page2el' }, |
| |
| html2canvas: { scale: 2 }, |
| jsPDF: { unit: 'cm', format: 'a4', orientation: 'portrait' } |
| } |
| |
| |
| html2pdf() |
| .from(element) |
| .set(options) |
| .output('blob') |
| .then((blob) => { |
| |
| console.log('blob :>> ', blob) |
| const url = URL.createObjectURL(blob) |
| try { |
| let file = this.transBlobFilrToFile(blob) |
| console.log('file :>> ', file) |
| |
| } 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;"> |
| 评估报告 |
| </p> |
| <el-divider></el-divider> |
| </div> |
| |
| <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') |
| |
| const options = { |
| margin: 1, |
| filename: '评估报告.pdf', |
| image: { type: 'jpeg', quality: 0.98 }, |
| pagebreak: { mode: 'avoid-all', before: '#page2el' }, |
| |
| html2canvas: { scale: 2 }, |
| jsPDF: { unit: 'cm', format: 'a4', orientation: 'portrait' } |
| } |
| |
| |
| html2pdf() |
| .from(element) |
| .set(options) |
| .output('blob') |
| .then((blob) => { |
| |
| console.log('blob :>> ', blob) |
| const url = URL.createObjectURL(blob) |
| try { |
| let file = this.transBlobFilrToFile(blob) |
| console.log('file :>> ', file) |
| |
| } catch (e) { |
| console.log(e) |
| } |
| }) |
| }, |
| } |
| mounted() { |
| setTimeout(()=>{ |
| this.downloadPDF() |
| }.500) |
| }, |
| }, |
| |
| } |
| </script> |
复制
问题
- mounted处理需要是从别的页面跳转过来这个页面才可以生效,那如果是在原基础页面弹窗出这个页面,怎么样才能保险生成pdf呢?求告知~
- 怎么处理页面页脚,求告知~~