欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue前端如何實現(xiàn)生成PDF并下載功能詳解

 更新時間:2021年10月08日 09:53:55   作者:明天也要努力  
在前端的崗位上經(jīng)常需要實現(xiàn)個生成個并下載的可視化圖表頁P(yáng)DF文件,這篇文章主要給大家介紹了關(guān)于Vue前端如何實現(xiàn)生成PDF并下載功能的相關(guān)資料,需要的朋友可以參考下

思路: 通過 html2canvas 將 HTML 頁面轉(zhuǎn)換成圖片,然后再通過 jspdf 將圖片的 base64 生成為 pdf 文件。

1. 安裝及引入

// 將頁面 html 轉(zhuǎn)換成圖片
npm install html2canvas --save  
// 將圖片生成 pdf
npm install jspdf --save

在項目主文件 main.js 中引入定義好的實現(xiàn)方法并注冊

import htmlToPdf from '@/utils/htmlToPdf';
// 使用 Vue.use() 方法就會調(diào)用工具方法中的install方法
Vue.use(htmlToPdf);

傳送門:Vue中 Vue.use() 原理及使用

2. 封裝導(dǎo)出 pdf 文件方法

配置詳解

let pdf = new jsPDF('p', 'pt', [pdfX, pdfY]);
第一個參數(shù): l:橫向  p:縱向
第二個參數(shù):測量單位("pt","mm", "cm", "m", "in" or "px");
第三個參數(shù):可以是下面格式,默認(rèn)為“a4”。如需自定義格式,只需將大小作為數(shù)字?jǐn)?shù)組傳遞,如:[592.28, 841.89];
		   a0 - a10
		   b0 - b10
		   c0 - c10
  		   dl
		   letter
		   government-letter
		   legal
		   junior-legal
		   ledger
		   tabloid
		   credit-card

pdf.addPage()  在PDF文檔中添加新頁面,默認(rèn)a4。參數(shù)如下:

pdf.addImage()  將圖像添加到PDF。參數(shù)如下:

刪除某頁 pdf

let targetPage = pdf.internal.getNumberOfPages(); //獲取總頁
pdf.deletePage(targetPage); // 刪除目標(biāo)頁

保存 pdf 文檔

pdf.save(`測試.pdf`);

封裝導(dǎo)出 pdf 文件方法(utils/htmlToPdf.js)

// 導(dǎo)出頁面為PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default{
  install (Vue, options) {
    Vue.prototype.getPdf = function () {
      // 當(dāng)下載pdf時,若不在頁面頂部會造成PDF樣式不對,所以先回到頁面頂部再下載
      let top = document.getElementById('pdfDom');
      if (top != null) {
        top.scrollIntoView();
        top = null;
      }
      let title = this.exportPDFtitle;
      html2Canvas(document.querySelector('#pdfDom'), {
        allowTaint: true
      }).then(function (canvas) {
        // 獲取canvas畫布的寬高
        let contentWidth = canvas.width;
        let contentHeight = canvas.height;
	      // 一頁pdf顯示html頁面生成的canvas高度;
        let pageHeight = contentWidth / 841.89 * 592.28;
	      // 未生成pdf的html頁面高度
        let leftHeight = contentHeight;
	      // 頁面偏移
        let position = 0;
	      // html頁面生成的canvas在pdf中圖片的寬高(本例為:橫向a4紙[841.89,592.28],縱向需調(diào)換尺寸)
        let imgWidth = 841.89;
        let imgHeight = 841.89 / contentWidth * contentHeight;
        let pageData = canvas.toDataURL('image/jpeg', 1.0);
        let PDF = new JsPDF('l', 'pt', 'a4');
        // 兩個高度需要區(qū)分: 一個是html頁面的實際高度,和生成pdf的頁面高度
        // 當(dāng)內(nèi)容未超過pdf一頁顯示的范圍,無需分頁
        if (leftHeight < pageHeight) {
          PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
        } else {
          while (leftHeight > 0) {
            PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
            leftHeight -= pageHeight;
            position -= 592.28;
            // 避免添加空白頁
            if (leftHeight > 0) {
              PDF.addPage();
            }
          }
        }
        PDF.save(title + '.pdf')
      })
    }
  }
}

相關(guān)組件中應(yīng)用

<template>
  <div class="wrap" >
    <div id="pdfDom" style="padding: 10px;">
      <el-table
        :data="tableData"
        border>
        <el-table-column prop="date" label="日期" width="250"></el-table-column>
        <el-table-column prop="name" label="姓名" width="250"></el-table-column>
        <el-table-column prop="address" label="地址"></el-table-column>
      </el-table>
    </div>
    <button type="button" style="margin-top: 20px;" @click="btnClick">導(dǎo)出PDF</button>
  </div>

</template>
 
<script>
export default {
  data() { 
    return {
      exportPDFtitle: "頁面導(dǎo)出PDF文件名",
      tableData: [
         {
          date: '2016-05-06',
          name: '王小虎',
          address: '重慶市九龍坡區(qū)火炬大道'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '重慶市九龍坡區(qū)火炬大道'
        },{
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '南京市江寧區(qū)將軍大道'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '南京市江寧區(qū)將軍大道'
        },, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        },{
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '武漢市洪山區(qū)文化大道'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '武漢市洪山區(qū)文化大道'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '武漢市洪山區(qū)文化大道'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '南京市江寧區(qū)將軍大道'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '武漢市洪山區(qū)文化大道'
        },
      ]
    } 
  }, 
  methods: {
    btnClick(){
      this.$nextTick(() => {this.getPdf();})
    },
  },  
}
</script>  

效果

待優(yōu)化部分

  1. 分頁時,頁面內(nèi)容被截斷(歡迎留言討論交流);
  2. 不同內(nèi)容,另起一頁開始;思路:計算超出內(nèi)容,占最后一頁的高度(設(shè)定間距 =  頁面高度 - 超出部分高度)。

總結(jié)

到此這篇關(guān)于Vue前端如何實現(xiàn)生成PDF并下載功能的文章就介紹到這了,更多相關(guān)Vue前端生成PDF并下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3中onUnmounted使用詳解

    vue3中onUnmounted使用詳解

    在Vue3中,onUnmounted是一個生命周期鉤子,它會在組件實例被卸載(unmounted)和銷毀之前被調(diào)用,本文給大家介紹vue3中onUnmounted使用詳解,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 詳解 vue better-scroll滾動插件排坑

    詳解 vue better-scroll滾動插件排坑

    本篇文章主要介紹了詳解 vue better-scroll滾動插件排坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • vue?中簡單使用mock的示例代碼詳解

    vue?中簡單使用mock的示例代碼詳解

    這篇文章主要介紹了vue?中簡單使用mock的方法,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • 在vue-cli搭建的項目中增加后臺mock接口的方法

    在vue-cli搭建的項目中增加后臺mock接口的方法

    這篇文章主要介紹了在vue-cli搭建的項目中增加后臺mock接口的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • vue計算屬性和監(jiān)聽器實例解析

    vue計算屬性和監(jiān)聽器實例解析

    本文通過基本實例給大家介紹了vue計算屬性和監(jiān)聽器的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • 在 Linux/Unix 中不重啟 Vim 而重新加載 .vimrc 文件的流程

    在 Linux/Unix 中不重啟 Vim 而重新加載 .vimrc 文件的流程

    這篇文章主要介紹了在 Linux/Unix 中不重啟 Vim 而重新加載 .vimrc 文件的流程,需要的朋友可以參考下
    2018-03-03
  • vue中使用event.target.value踩坑記錄

    vue中使用event.target.value踩坑記錄

    這篇文章主要介紹了vue中使用event.target.value踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能

    vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能

    這篇文章主要介紹了vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • vueJs函數(shù)toRaw?markRaw使用對比詳解

    vueJs函數(shù)toRaw?markRaw使用對比詳解

    這篇文章主要為大家介紹了vueJs函數(shù)toRaw?markRaw使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • vue input 輸入校驗字母數(shù)字組合且長度小于30的實現(xiàn)代碼

    vue input 輸入校驗字母數(shù)字組合且長度小于30的實現(xiàn)代碼

    這篇文章主要介紹了vue input 校驗字母數(shù)字組合且長度小于30的實現(xiàn)代碼,文章給大家補(bǔ)充介紹了在Vue.Js下使用el-input框只能輸入數(shù)字并限制位數(shù)并且限制中文輸入以及粘貼功能,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05

最新評論