欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue2.0全局组件之pdf详解

程序员文章站 2022-06-03 13:49:13
目的:像elementui那样注册全局组件 预览pdf文件 技术支持:使用火狐的pdf.js 准备:新建一个cpdf.vue文件,把火狐demo里面的build里面的...

目的:像elementui那样注册全局组件 预览pdf文件

技术支持:使用火狐的pdf.js

准备:新建一个cpdf.vue文件,把火狐demo里面的build里面的pdf.js下载来,并且依赖了elementui开发的其实就是用了<el-button>

vue2.0全局组件之pdf详解

编写:

template

<template>
  <div class="cpdf">
   <div class="center">
     <div class="contor">
      <el-button @click="prev">上一页</el-button>
      <el-button @click="next">下一页</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">关闭</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 生成的对象
      pagenum: 1,//
      pagerendering: false,
      pagenumpending: null,
      scale: 1.2,//放大倍数
      page_num: 0,//当前页数
      page_count: 0,//总页数
      maxscale: 2,//最大放大倍数
      minscale: 0.8//最小放大倍数
     }
   },
   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() {//上一页
      let vm = this
      if(vm.pagenum <= 1) {
        return;
      }
      vm.pagenum--;
      vm.queuerenderpage(vm.pagenum);
     },
     next() {//下一页
      let vm = this
      if(vm.pagenum >= vm.page_count) {
        return;
      }
      vm.pagenum++;
      vm.queuerenderpage(vm.pagenum);
     },
     closepdf() {//关闭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;
     }
   }
  }

注册到全局:在main.js 引入cpdf.vue

vue.component(cpdf.name, cpdf)

使用:在想预览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
     },
}

效果:

 vue2.0全局组件之pdf详解

npm :有人关注 那么我就发到 npm 上。 地址

本文已被整理到了《vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。