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

技术支持:使用火狐的pdf.js http://mozilla.github.io/pdf.js/

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

编写:

template

<template>
      <div class="cpdf">
            <div class="center">
                  <div class="contor">
                        <el-button @click="prev">上一页</el-button>
                        <el-button @click="next">下一页</el-button> &nbsp; &nbsp;
                        <span>Page: <span v-text="page_num"></span> / <span v-text="page_count"></span></span>
                        &nbsp; &nbsp;
                        <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的更多相关文章

  1. 手把手教你撸个vue2.0弹窗组件

    手把手教你撸个vue2.0弹窗组件 在开始之前需要了解一下开发vue插件的前置知识,推荐先看一下vue官网的插件介绍 预览地址 http://haogewudi.me/kiko/inde... 源码地 ...

  2. vue2 自定义全局组件(Loading加载效果)

    vue2 自定义全局组件(Loading加载效果) github地址: https://github.com/ccyinghua/custom-global-component 一.构建项目 vue ...

  3. vue.js+koa2项目实战(五)axios 及 vue2.0 子组件和父组件之间的传值

    axios 用法: 1.安装 npm install axios --save-dev 2.导入 import axios from 'axios'; 3.使用 axios.post(url,para ...

  4. 基于vue2.0前端组件库element中 el-form表单 自定义验证填坑

    eleme写的基于vue2.0的前端组件库: http://element.eleme.io 我在平时使用过程中,遇到的问题. 自定义表单验证出坑: 1: validate/resetFields 未 ...

  5. vue2.0父子组件之间通信

    父组件是通过props属性给子组件通信的来看下代码: 父组件: <parent> <child :child-com="content"></chil ...

  6. vue2.0 父子组件通信 兄弟组件通信

    父组件是通过props属性给子组件通信的来看下代码: 父组件: <parent> <child :child-com="content"></chil ...

  7. vue2.0子组件修改父组件props数据的值

    从vue1.0升级至2.0之后 prop的.sync被去除 因此直接在子组件修改父组件的值是会报错的如下: 目的是为了阻止子组件影响父组件的数据那么在vue2.0之后 如何在子组件修改父组件props ...

  8. vue2.0 父子组件数据传递prop

    vue的一个核心概念就是组件,而组件实例的作用域是孤立的,所以组件之间是不能直接引用其他组件的数据的.极端点举例来说,就是可以在同一个项目中,每一个组件内都可以定义相同名称的数据. data () { ...

  9. vue2.0父子组件通信的方法

    vue2.0组件通信方法:props传值和emit监听.(.sync方法已经移除.详情请点击)(dispatch-和-broadcast方法也已经废弃) props方法传值:Props 现在只能单项传 ...

随机推荐

  1. 全局文件 pch

    在 bulding setting 里面 搜 prefix header 然后添加自己的pch 路径, 类似 $(SRCROOT)/... 还要把 precompile prefix header 设 ...

  2. php5.4下配置zend guard loader

    前些日子的时候,zend官网下还没有支持PHP5.4的zend guard loader,今天再上去看的时候居然发现了,看来是我好久不关注它的缘故了... zend guard loader 干什么的 ...

  3. log4net的分类型输出文件的配置

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...

  4. 使用Intent创建Tab页面

    前面已经介绍了如何使用TabActivity来创建Activity布局,前面添加Tab页面使用了TabHost.TabSpec如下方法. setContent(int viewId):直接将指定Vie ...

  5. localToLocal坐标变换

    localToLocal坐标变换 $(function() { init(); }); // localtoLocal var stage, arm, handler; function init(e ...

  6. jquery图片放大镜和遮罩层效果

    图片放大镜效果将借助于jqzoom插件,遮罩层借助于thickbox插件. 1.引入样式表 /*整体样式*/ <link rel="stylesheet" href=&quo ...

  7. c#中Partial关键字的作用

    1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在 ...

  8. ASP.NET Zero--12.一个例子(5)商品分类管理-编辑分类

    1.添加编辑按钮 打开文件Index.js [..\MyCompanyName.AbpZeroTemplate.Web\Areas\Mpa\Views\Category\Index.js] 在acti ...

  9. loadrunner:参数类型及其取值机制

    参数类型 参数名随意取,建议取通俗易懂的名字,下面我们重点介绍一下参数的类型. ●DateTime: 很简单, 在需要输入日期/时间的地方, 可以用DateTime 类型来替代. 其属性设置也很简单, ...

  10. POJ1556(割点)

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8114   Accepted: 3716 Description C ...