vue2.0全局组件之pdf详解
程序员文章站
2023-09-06 16:05:47
目的:像elementui那样注册全局组件 预览pdf文件
技术支持:使用火狐的pdf.js
准备:新建一个cpdf.vue文件,把火狐demo里面的build里面的...
目的:像elementui那样注册全局组件 预览pdf文件
技术支持:使用火狐的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> <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 }, }
效果:
npm :有人关注 那么我就发到 npm 上。 地址
本文已被整理到了《vue.js前端组件学习教程》,欢迎大家学习阅读。
关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 详解vue事件对象、冒泡、阻止默认行为
下一篇: JS作用域链详解