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 相关文章推荐
Save a File Using a File Save Dialog Box
Jun 18 Javascript
extJs 下拉框联动实现代码
Apr 09 Javascript
分享一个自己动手写的jQuery分页插件
Aug 28 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
Nov 13 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
Mar 03 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
Oct 27 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
vue中的event bus非父子组件通信解析
Oct 27 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
javascript验证form表单数据的案例详解
Mar 25 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
PHP令牌 Token改进版
2008/07/18 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
php实现的生成排列算法示例
2019/07/25 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python何时应该使用Lambda函数
2019/07/02 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
syb养殖创业计划书
2014/01/09 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
工作分析计划书
2014/04/30 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
springboot如何初始化执行sql语句
2021/06/22 Java/Android
Go语言安装并操作redis的go-redis库
2022/04/14 Golang