最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue前端實現(xiàn)導出頁面為pdf(分頁導出、不分頁導出及分模塊導出)

 更新時間:2024年06月12日 08:30:48   作者:鹽多碧咸。。  
在實際應用中可能用戶希望將系統(tǒng)中一個頁面展示的所有數(shù)據(jù)報表,用PDF的文件格式下載下來,以便于其他用途,這篇文章主要給大家介紹了關于vue前端實現(xiàn)導出頁面為pdf(分頁導出、不分頁導出及分模塊導出)的相關資料,需要的朋友可以參考下

第一步:下載插件

npm install --save html2canvas       // 頁面轉(zhuǎn)圖片
npm install jspdf --save             // 圖片轉(zhuǎn)pdf

第二步:main.js 文件引入

import htmlToPdf from './utils/htmlToPdf';
Vue.use(htmlToPdf);

第三步:utils/htmlToPdf.js 文件中定義方法(有三種方法:分頁導出、不分頁導出、分模塊導出;具體方法 見最下邊)

第四步:vue頁面調(diào)用方法 (htmlToPdf)

方法一: 標準打印(分頁打?。蝗秉c:分頁處會把內(nèi)容給截斷

export default {
  install(Vue) {
    // eslint-disable-next-line func-names
    Vue.prototype.htmlToPdf = function (ele, title) {
      const dom = document.querySelector('#' + ele)
      html2Canvas(dom, {
        useCORS: true,//解決網(wǎng)絡圖片跨域問題
        width: dom.width,
        height: dom.height,
        windowWidth: dom.scrollWidth,
        dpi: window.devicePixelRatio * 4, // 將分辨率提高到特定的DPI 提高四倍
        scale: 4, // 按比例增加分辨率
      }).then((canvas) => {
        // eslint-disable-next-line new-cap
        const pdf = new JsPDF('p', 'mm', 'a4'); // A4紙,縱向
        const ctx = canvas.getContext('2d');
        const a4w = 170; 
        const a4h = 250; // A4大小,210mm x 297mm,四邊各保留20mm的邊距,顯示區(qū)域170x257
        const imgHeight = Math.floor(a4h * canvas.width / a4w); // 按A4顯示比例換算一頁圖像的像素高度
        let renderedHeight = 0;
 
        while (renderedHeight < canvas.height) {
          const page = document.createElement('canvas');
          page.width = canvas.width;
          page.height = Math.min(imgHeight, canvas.height - renderedHeight);// 可能內(nèi)容不足一頁
 
          // 用getImageData剪裁指定區(qū)域,并畫到前面創(chuàng)建的canvas對象中
          page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
          pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 20, 20, a4w, Math.min(a4h, a4w * page.height / page.width)); // 添加圖像到頁面,保留10mm邊距
 
          renderedHeight += imgHeight;
          if (renderedHeight < canvas.height) {
            pdf.addPage();// 如果后面還有內(nèi)容,添加一個空頁
          }
          // 預覽pdf(這里我用的是事件總線把canvas傳遞過去展示,達到模擬pdf預覽的效果,有用但效果不是很好,有需要的可以自行修改)
          //this.$EventBus.$emit('open-pdf', canvas);
        }
        // 保存文件
        pdf.save(`${title}.pdf`);
      });
    };
  },
}

方法二: 標準打?。ú环猪摯蛴。?/h3>
export default {
  install(Vue) {
    Vue.prototype.htmlToPdf = function (name, title) {
      html2Canvas(document.querySelector('#' + name), {
        // allowTaint: true,
        useCORS: true,
        scale: 2, // 提升畫面質(zhì)量,但是會增加文件大小
        dpi: window.devicePixelRatio * 1,
      }).then((canvas) => {
        const contentWidth = canvas.width
        const contentHeight = canvas.height
         
         /* 導出不分頁處理 */
        const pageData = canvas.toDataURL('image/jpeg', 1.0)

        const pdfWidth = (contentWidth + 10) / 2 * 0.75
        const pdfHeight = (contentHeight + 200) / 2 * 0.75 // 500為底部留白

        const imgWidth = pdfWidth
        const imgHeight = (contentHeight / 2 * 0.75) // 內(nèi)容圖片這里不需要留白的距離

        const PDF = new JsPDF('', 'pt', [ pdfWidth + 50, pdfHeight + 100, ])
        PDF.addImage(pageData, 'jpeg', 33, 33, imgWidth, imgHeight)
        PDF.save(title + '.pdf')
      })
    };
  },
}

方法三: 分模塊打印(一個模塊一個頁面)

export default {
  install(Vue) {
    Vue.prototype.htmlToPdf = async function (name, title) {
      const ele = document.querySelector('#' + name)
      const eleW = ele.offsetWidth// 獲得該容器的寬
      const eleH = ele.offsetHeight// 獲得該容器的高
    
      const eleOffsetTop = ele.offsetTop // 獲得該容器到文檔頂部的距離
      const eleOffsetLeft = ele.offsetLeft // 獲得該容器到文檔最左的距離
    
      var canvas = document.createElement('canvas')
      var abs = 0
    
      const win_in = document.documentElement.clientWidth || document.body.clientWidth // 獲得當前可視窗口的寬度(不包含滾動條)
      const win_out = window.innerWidth // 獲得當前窗口的寬度(包含滾動條)
    
      if (win_out > win_in) {
        // abs = (win_o - win_i)/2;    // 獲得滾動條長度的一半
        abs = (win_out - win_in) / 2 // 獲得滾動條寬度的一半
        // console.log(a, '新abs');
      }
    
      canvas.width = eleW * 2 // 將畫布寬&&高放大兩倍
      canvas.height = eleH * 2
    
      var context = canvas.getContext('2d')
    
      context.scale(2, 2)
    
      context.translate(-eleOffsetLeft - abs, -eleOffsetTop)
      // 這里默認橫向沒有滾動條的情況,因為offset.left(),有無滾動條的時候存在差值,因此
      // translate的時候,要把這個差值去掉
    
      var pdf = new JsPDF('', 'pt', 'a4')
      const childrenBox = ele.children
      for (let i = 0; i < childrenBox.length; i++) { // 循環(huán)傳過來的Dom的字節(jié)點 每個子節(jié)點打印成一頁pdf A4紙那么大
        console.log(childrenBox,'childrenBox');
        console.log(1111);
        const res = await html2Canvas(childrenBox[i], {
          dpi: 300,
          // allowTaint: true,  //允許 canvas 污染, allowTaint參數(shù)要去掉,否則是無法通過toDataURL導出canvas數(shù)據(jù)的
          useCORS: true, // 允許canvas畫布內(nèi) 可以跨域請求外部鏈接圖片, 允許跨域請求。
          scale: 4, // 提升導出的文件的分辨率
        })
        var pageData = res.toDataURL('image/jpeg', 1.0)
        var contentWidth = res.width
        var contentHeight = res.height
        var imgWidth = 555.28
        var imgHeight = 552.28 / contentWidth * contentHeight
        pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)
        if (i < childrenBox.length - 1) {
          pdf.addPage() // 避免最后多一個空白頁
        }
      }

      pdf.save(`${title}.pdf`);
    };
  },
}

總結(jié) 

到此這篇關于vue前端實現(xiàn)導出頁面為pdf的文章就介紹到這了,更多相關vue前端導出頁面pdf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue-cli4.0多環(huán)境配置變量與模式詳解

    vue-cli4.0多環(huán)境配置變量與模式詳解

    這篇文章主要介紹了vue-cli4.0多環(huán)境配置變量與模式詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Vue的data為啥只能是函數(shù)原理詳解

    Vue的data為啥只能是函數(shù)原理詳解

    這篇文章主要為大家介紹了Vue的data為啥只能是函數(shù)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Vue3父子組件互調(diào)方法的實現(xiàn)

    Vue3父子組件互調(diào)方法的實現(xiàn)

    本文主要介紹了Vue3父子組件互調(diào)方法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • el-table 行合并的實現(xiàn)示例

    el-table 行合并的實現(xiàn)示例

    本文主要介紹了el-table 行合并的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Vue 引入AMap高德地圖的實現(xiàn)代碼

    Vue 引入AMap高德地圖的實現(xiàn)代碼

    這篇文章主要介紹了Vue 引入AMap高德地圖的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Vue項目中ESlint規(guī)范示例代碼

    Vue項目中ESlint規(guī)范示例代碼

    這篇文章主要給大家介紹了關于Vue項目中ESlint規(guī)范的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • 在Vue3項目中關閉ESLint的完整步驟

    在Vue3項目中關閉ESLint的完整步驟

    實際上在學習過程中,你會發(fā)現(xiàn)eslint檢查特別討厭,這個時候我們需要關閉掉eslint檢查,下面這篇文章主要給大家介紹了關于在Vue3項目中關閉ESLint的完整步驟,需要的朋友可以參考下
    2023-11-11
  • 詳解Vue中組件的緩存

    詳解Vue中組件的緩存

    這篇文章主要介紹了Vue中組件的緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • vue的mixins屬性詳解

    vue的mixins屬性詳解

    這篇文章主要介紹了vue的mixins屬性詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • vue開發(fā)runtime core中的虛擬節(jié)點示例詳解

    vue開發(fā)runtime core中的虛擬節(jié)點示例詳解

    這篇文章主要為大家介紹了vue開發(fā)runtime core中的虛擬節(jié)點示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

南木林县| 商水县| 丹凤县| 岑巩县| 探索| 宁安市| 临沭县| 和平县| 金堂县| 蒙自县| 清涧县| 平塘县| 东莞市| 林州市| 阿拉善左旗| 镇康县| 大英县| 宝应县| 娄烦县| 海晏县| 岫岩| 花莲县| 盐津县| 孝感市| 宽城| 三门峡市| 赤壁市| 改则县| 冷水江市| 陵水| 双桥区| 文安县| 射洪县| 阜新| 扬州市| 汝城县| 广元市| 锡林郭勒盟| 霍林郭勒市| 永善县| 山阳县|