国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

vue2.0全局組件之pdf詳解

2019-11-19 16:15:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

目的:像elementUI那樣注冊(cè)全局組件 預(yù)覽pdf文件

技術(shù)支持:使用火狐的pdf.js http://mozilla.github.io/pdf.js/

準(zhǔn)備:新建一個(gè)CPdf.vue文件,把火狐demo里面的build里面的pdf.js下載來(lái),并且依賴(lài)了elementUI開(kāi)發(fā)的其實(shí)就是用了<el-button>

編寫(xiě):

template

<template>  <div class="cpdf">   <div class="center">     <div class="contor">      <el-button @click="prev">上一頁(yè)</el-button>      <el-button @click="next">下一頁(yè)</el-button>          <span>Page: <span v-text="page_num"></span> / <span v-text="page_count"></span></span>               <el-button @click="addscale" icon="plus"></el-button>      <el-button @click="minus" icon="minus"></el-button>      <el-button id="prev" @click="closepdf">關(guān)閉</el-button>     </div>     <canvas class="canvasstyle" id="the-canvas"></canvas>   </div>  </div></template>

js

 import PDFJS from '../../../static/pdf/pdf.js'  import {   mapActions,   mapGetters  } from 'vuex';  export default {   name: 'c-pdf',   props: ['pdfurl'],   data() {     return {      pdfDoc: null, //pdfjs 生成的對(duì)象      pageNum: 1,//      pageRendering: false,      pageNumPending: null,      scale: 1.2,//放大倍數(shù)      page_num: 0,//當(dāng)前頁(yè)數(shù)      page_count: 0,//總頁(yè)數(shù)      maxscale: 2,//最大放大倍數(shù)      minscale: 0.8//最小放大倍數(shù)     }   },   methods: {     renderPage(num) { //渲染pdf      let vm = this      this.pageRendering = true;      let canvas = document.getElementById('the-canvas')      // Using promise to fetch the page      this.pdfDoc.getPage(num).then(function(page) {        var viewport = page.getViewport(vm.scale);        //alert(vm.canvas.height)        canvas.height = viewport.height;        canvas.width = viewport.width;        // Render PDF page into canvas context        var renderContext = {         canvasContext: vm.ctx,         viewport: viewport        };        var renderTask = page.render(renderContext);        // Wait for rendering to finish        renderTask.promise.then(function() {         vm.pageRendering = false;         if(vm.pageNumPending !== null) {           // New page rendering is pending           vm.renderPage(vm.pageNumPending);           vm.pageNumPending = null;         }        });      });      vm.page_num = vm.pageNum;     },     addscale() {//放大      if(this.scale >= this.maxscale) {        return      }      this.scale += 0.1;      this.queueRenderPage(this.pageNum)     },     minus() {//縮小      if(this.scale <= this.minscale) {        return      }      this.scale -= 0.1;      this.queueRenderPage(this.pageNum)     },     prev() {//上一頁(yè)      let vm = this      if(vm.pageNum <= 1) {        return;      }      vm.pageNum--;      vm.queueRenderPage(vm.pageNum);     },     next() {//下一頁(yè)      let vm = this      if(vm.pageNum >= vm.page_count) {        return;      }      vm.pageNum++;      vm.queueRenderPage(vm.pageNum);     },     closepdf() {//關(guān)閉PDF      this.$emit('closepdf')     },     queueRenderPage(num) {      if(this.pageRendering) {        this.pageNumPending = num;      } else {        this.renderPage(num);      }     }   },   computed: {     ctx() {      let id = document.getElementById('the-canvas')      return id.getContext('2d');     }   },   mounted() {     let vm = this     PDFJS.getDocument(vm.pdfurl).then(function(pdfDoc_) { //初始化pdf      vm.pdfDoc = pdfDoc_;      vm.page_count = vm.pdfDoc.numPages      vm.renderPage(vm.pageNum);     });   }  }

style less

 .cpdf {   position: fixed;   top: 0;   left: 0;   background-color: rgba(0, 0, 0, .5);   width: 100%;   height: 100%;   z-index: 99999;   display: flex;   justify-content: center;   align-items: center;   .center {     text-align: center;     height: 100%;     overflow: auto;     padding-top: 20px;     .contor {      margin-bottom: 10px;     }   }  }

注冊(cè)到全局:在main.js 引入CPdf.vue

Vue.component(CPdf.name, CPdf)

使用:在想預(yù)覽pdf文件的組件里面

<c-pdf @closepdf="closepdf" v-show="isshowpdf" :pdfurl="testpdfurl"></c-pdf>
data() {     return {            isshowpdf:false,      testpdfurl:'//cdn.mozilla.net/pdfjs/tracemonkey.pdf'     }   },methods: {     closepdf(){      this.isshowpdf=false     },}

效果:

 

npm :有人關(guān)注 那么我就發(fā)到 npm 上。 地址 https://www.npmjs.com/package/vueshowpdf

本文已被整理到了《Vue.js前端組件學(xué)習(xí)教程》,歡迎大家學(xué)習(xí)閱讀。

關(guān)于vue.js組件的教程,請(qǐng)大家點(diǎn)擊專(zhuān)題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 荔波县| 鹰潭市| 和平区| 乐亭县| 清镇市| 吉木乃县| 子洲县| 秦安县| 高青县| 改则县| 安龙县| 师宗县| 麻栗坡县| 清水河县| 濮阳市| 进贤县| 德州市| 安图县| 余姚市| 定远县| 阜平县| 嵊州市| 清水县| 云浮市| 卓资县| 神木县| 阿坝| 甘谷县| 峨边| 县级市| 江都市| 阿克苏市| 温宿县| 五大连池市| 承德市| 乐东| 邛崃市| 浮山县| 色达县| 腾冲县| 海原县|