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 相关文章推荐
用js实现的检测浏览器和系统的函数
Apr 09 Javascript
解析window.open的使用方法总结
Jun 19 Javascript
javascript根据像素点取位置示例
Jan 27 Javascript
小议JavaScript中Generator和Iterator的使用
Jul 29 Javascript
利用JS生成博文目录及CSS定制博客
Feb 10 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
JavaScript必知必会(三) String .的方法来自何方
Jun 08 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
微信小程序 Template详解及简单实例
Jan 05 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
Sep 25 Javascript
使用原生javascript开发计算器实例代码
Feb 21 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 输出缓冲控制(Output Control)详解
2016/08/25 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
IE6 fixed的完美解决方案
2011/03/31 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
简单实现js进度条加载效果
2020/03/25 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
vue.js删除列表中的一行
2018/06/30 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python类装饰器实现方法详解
2018/12/21 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
求职自我评价怎么写
2015/03/09 职场文书
技术员岗位职责范本
2015/04/11 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
英语投诉信范文
2015/07/03 职场文书
领导离职感言
2015/08/03 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
关于MySQL中的 like操作符详情
2021/11/17 MySQL