vue2.0全局组件之pdf详解


Posted in Javascript onJune 26, 2017

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

技术支持:使用火狐的pdf.js http://mozilla.github.io/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 上。 地址 https://www.npmjs.com/package/vueshowpdf

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

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

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

Javascript 相关文章推荐
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
Jun 10 Javascript
AngularJS 简单应用实例
Jul 28 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 jQuery
js遍历获取表格内数据的方法(必看)
Apr 06 Javascript
layui选项卡效果实现代码
May 19 Javascript
深入理解React高阶组件
Sep 28 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
Oct 27 Javascript
jQuery实现form表单序列化转换为json对象功能示例
May 23 jQuery
解决layui 表单元素radio不显示渲染的问题
Sep 04 Javascript
js实现时间日期校验
May 26 Javascript
JavaScript创建对象的七种方式(推荐)
Jun 26 #Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 #Javascript
JavaScript的六种继承方式(推荐)
Jun 26 #Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 #Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 #Javascript
JavaScript条件判断_动力节点Java学院整理
Jun 26 #Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
Jun 26 #Javascript
You might like
图书管理程序(一)
2006/10/09 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
cakephp常见知识点汇总
2017/02/24 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
python 带时区的日期格式化操作
2020/10/23 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
文明家庭先进事迹材
2014/01/27 职场文书
党员教师工作决心书
2014/03/13 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
投诉信范文
2015/07/02 职场文书
导游词之五台山
2019/10/11 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS