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 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
javascript 禁止复制网页
Jun 11 Javascript
jquery 图片缩放拖动的简单实例
Jan 08 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
js实现点击文本框显示日期选择器特效代码分享
May 21 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
浅析微信扫码登录原理(小结)
Oct 29 Javascript
深入浅析vue-cli@3.0 使用及配置说明
May 08 Javascript
JavaScript实现单英文金山打字通
Jul 24 Javascript
vue调用本地摄像头实现拍照功能
Aug 14 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图像处理函数大全(推荐收藏)
2013/07/11 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
小程序实现分类页
2019/07/12 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
Django实现登录随机验证码的示例代码
2018/06/20 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
文秘专业应届生求职信范文
2013/11/14 职场文书
内容编辑个人求职信
2013/12/10 职场文书
中学生自我鉴定
2014/02/04 职场文书
库房管理员岗位职责
2014/03/09 职场文书
大学生应聘求职信
2014/05/26 职场文书
培训研修方案
2014/06/06 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
素质教育学习心得体会
2016/01/19 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
python3实现无权最短路径的方法
2021/05/12 Python
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA