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

Vue頁面生成PDF的最佳方法推薦

 更新時(shí)間:2022年05月24日 10:04:35   作者:憤怒小綿羊  
公眾中經(jīng)常會有這種場景,一些合同、協(xié)議等的頁面需要進(jìn)行下載,而且需要和頁面保持一致,下面這篇文章主要給大家介紹了關(guān)于Vue頁面生成PDF的最佳方法,需要的朋友可以參考下

前言

最近項(xiàng)目有個(gè)需求,將系統(tǒng)統(tǒng)計(jì)的數(shù)據(jù)生成分析報(bào)告,然后可以導(dǎo)出成PDF。

這種方法可以有兩種,一種是直接調(diào)用打印,用戶通過瀏覽器提供的打印頁面手動選擇導(dǎo)出PDF。當(dāng)然這種方式兼容性差,且體驗(yàn)不好,顯然不是我們想要的效果。

那么第二種方法的實(shí)現(xiàn)思路是什么呢?

首先生成報(bào)告頁面,也就是常規(guī)頁面;

然后將頁面轉(zhuǎn)換成圖片( 用到的組件 html2canvas );

最后將圖片導(dǎo)出成PDF( 用到的組件 jspdf )。

安裝依賴

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

頁面轉(zhuǎn)圖片

新建一個(gè) index.vue 頁面:

<template>
  <div ref="pdf">
    這是待轉(zhuǎn)換的頁面,點(diǎn)擊 
    <button @click="handleExport">導(dǎo)出</button> 按鈕,完成導(dǎo)出操作。
  </div>
</template>

<script>
import {downloadPDF} from "@/util/pdf.js"  //工具方法,導(dǎo)出操作
export default {
  name: "pdf",
  data() {
    return {};
  },
  methods: {
    handleExport(){
      downloadPDF(this.$refs.pdf)
    }
  }
};
</script>

頁面很簡單,一段話加上一個(gè)導(dǎo)出按鈕。整個(gè)頁面被設(shè)置別名 (ref=“pdf”),導(dǎo)出的時(shí)候通過別名導(dǎo)出整個(gè)頁面。

按鈕點(diǎn)擊事件中調(diào)用了一個(gè)工具方法 downloadPDF(),來自于工具類 pdf.js:

import html2canvas from "html2canvas";

export const downloadPDF = page => {
  html2canvas(page).then(function(canvas) {
    page.appendChild(canvas);
  });
};

也很簡單,首先引入了 html2canvas,定義downloadPDF方法,接受一個(gè)參數(shù)就是要導(dǎo)出的內(nèi)容,可以使用id獲取,也可以使用 ref 。

運(yùn)行結(jié)果:

當(dāng)我們點(diǎn)擊導(dǎo)出按鈕后,在現(xiàn)有的頁面增加了一行相同的內(nèi)容。通過元素檢查器可以看到增加的這行內(nèi)容實(shí)際是一個(gè) canvas 圖像,里面的按鈕已經(jīng)不可以操作了。

這樣,頁面轉(zhuǎn)換圖片的過程就完成了。

圖片轉(zhuǎn)PDF

首先給index.vue改造一下,為了讓我們導(dǎo)出的pdf好看一點(diǎn),使用el-table做個(gè)表格,其它的導(dǎo)出邏輯不變:

<template>
  <div ref="pdf">
    
    <el-table
      :data="tableData"
      style="width: 700px">
      <el-table-column
        prop="date"
        label="時(shí)間"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="address"
        label="對我說">
      </el-table-column>
    </el-table>

    <button @click="handleExport">導(dǎo)出</button>
  </div>
</template>
<script>
import {downloadPDF} from "@/util/pdf.js"  //工具方法,導(dǎo)出操作
export default {
  name: "pdf",
  data() {
    return {
      
          tableData: [{
            date: '昨天',
            name: '劉德華',
            address: '你好帥'
          }, {
            date: '今天',
            name: '郭富城',
            address: '你最帥'
          }, {
            date: '明天',
            name: '張學(xué)友',
            address: '你賊帥'
          }, {
            date: '每天',
            name: '黎明',
            address: '我沒你帥'
          }]
    };
  },
  methods: {
    handleExport(){
      downloadPDF(this.$refs.pdf)
    }
  }
};
</script>

效果圖:

然后改造一下pdf.js,增加上pdf轉(zhuǎn)換邏輯

import html2canvas from "html2canvas";
import jsPDF from "jspdf";

export const downloadPDF = page => {
  html2canvas(page).then(function(canvas) {
    canvas2PDF(canvas);
  });
};

const canvas2PDF = canvas => {
  let contentWidth = canvas.width;
  let contentHeight = canvas.height;
  
  let imgHeight = contentHeight;
  let imgWidth = contentWidth;

  // 第一個(gè)參數(shù): l:橫向  p:縱向
  // 第二個(gè)參數(shù):測量單位("pt","mm", "cm", "m", "in" or "px")
  let pdf = new jsPDF("l", "pt");

  pdf.addImage(
    canvas.toDataURL("image/jpeg", 1.0),
    "JPEG",
    0,
    0,
    imgWidth,
    imgHeight
  );

  pdf.save("導(dǎo)出.pdf");
};

canvas2PDF 方法中創(chuàng)建了jsPDF的實(shí)例,然后添加上一步生成的圖片,最后保存導(dǎo)出pdf文件。

導(dǎo)出的文件效果:

A4打印適配

因?yàn)椴糠中枨笥行枰傻捻撁媸褂肁4紙打印,那么pdf生成時(shí)的寬高尺寸就不能像上面一樣設(shè)定。需要按照A4紙的尺寸比例調(diào)整(其它打印需求同理,使用對應(yīng)紙張比例即可)

那么改造一下 pdf.js

import html2canvas from "html2canvas";
import jsPDF from "jspdf";

export const downloadPDF = page => {
  html2canvas(page).then(function(canvas) {
    canvas2PDF(canvas);
  });
};

const canvas2PDF = canvas => {
  let contentWidth = canvas.width;
  let contentHeight = canvas.height;

  //a4紙的尺寸[595.28,841.89],html頁面生成的canvas在pdf中圖片的寬高
  let imgWidth = 595.28;
  let imgHeight = 592.28/contentWidth * contentHeight;

  // 第一個(gè)參數(shù): l:橫向  p:縱向
  // 第二個(gè)參數(shù):測量單位("pt","mm", "cm", "m", "in" or "px")
  let pdf = new jsPDF("p", "pt");

  pdf.addImage(
    canvas.toDataURL("image/jpeg", 1.0),
    "JPEG",
    0,
    0,
    imgWidth,
    imgHeight
  );

  pdf.save("導(dǎo)出.pdf");
};

這里面將 imgWidth 和 imgHeight 按照A4紙比例調(diào)整后,導(dǎo)出的pdf就可以正常比例打印了。

總結(jié)

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

相關(guān)文章

  • Vue CLI 3搭建vue+vuex最全分析(推薦)

    Vue CLI 3搭建vue+vuex最全分析(推薦)

    這篇文章主要介紹了Vue CLI 3搭建vue+vuex最全分析(推薦),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • vue下載二進(jìn)制流圖片操作

    vue下載二進(jìn)制流圖片操作

    這篇文章主要介紹了vue下載二進(jìn)制流圖片操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • vue實(shí)現(xiàn)過渡動畫Message消息提示組件示例詳解

    vue實(shí)現(xiàn)過渡動畫Message消息提示組件示例詳解

    這篇文章主要為大家介紹了vue實(shí)現(xiàn)過渡動畫Message消息提示組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vue實(shí)現(xiàn)購物車加減

    vue實(shí)現(xiàn)購物車加減

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)購物車加減,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 詳解vue3+electron如何做到本地化

    詳解vue3+electron如何做到本地化

    要在Vue?3和Electron中實(shí)現(xiàn)本地化,可以使用類似于在Vue項(xiàng)目中進(jìn)行本地化的方式,本文為大家介紹了一種常見的做法,希望對大家有所幫助
    2024-03-03
  • 詳解Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù)

    詳解Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù)

    在使用?.vue?定義的組件中,setup?中提供了?defineExpose()?方法,該方法可以將組件內(nèi)部的方法暴露給父組件,這篇文章主要介紹了Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù),需要的朋友可以參考下
    2022-10-10
  • Vue實(shí)例初始化為渲染函數(shù)設(shè)置檢查源碼剖析

    Vue實(shí)例初始化為渲染函數(shù)設(shè)置檢查源碼剖析

    這篇文章主要為大家介紹了Vue實(shí)例初始化為渲染函數(shù)設(shè)置檢查源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue如何自定義組件v-model

    vue如何自定義組件v-model

    這篇文章主要介紹了vue如何自定義組件v-model問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vuex 入門教程

    Vuex 入門教程

    這篇文章主要介紹了Vuex 入門教程,Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式, 那這個(gè) vuex 怎么用呢?就具體來看一下吧
    2018-01-01
  • 如何使用vue-pdf-embed實(shí)現(xiàn)PDF在線預(yù)覽

    如何使用vue-pdf-embed實(shí)現(xiàn)PDF在線預(yù)覽

    vue-pdf-embed是一個(gè)基于Vue.js的插件,專門用于在Vue應(yīng)用中嵌入和展示PDF文件,本文將使用vue-pdf-embed實(shí)現(xiàn)PDF在線預(yù)覽功能,有需要的小伙伴可以參考一下
    2025-03-03

最新評論

苏尼特右旗| 永昌县| 桐乡市| 体育| 平潭县| 邮箱| 巴彦淖尔市| 大足县| 隆林| 潢川县| 聂拉木县| 莲花县| 浦县| 柘荣县| 闽侯县| 三明市| 福建省| 社会| 开远市| 随州市| 光山县| 常州市| 元江| 贵港市| 鞍山市| 康马县| 临海市| 阿尔山市| 阿图什市| 民勤县| 水富县| 济南市| 平凉市| 烟台市| 乳源| 南充市| 海盐县| 梧州市| 太原市| 乐安县| 新和县|