vue项目实现pdf文件预览功能
下载vue-pdf包
npm install --save vue-pdf
template模板内容:
//pdf组件 <pdf :src="pdffile" :page="currentpage" @num-pages="pagecount=$event" @page-loaded="currentpage=$event" @loaded="loadpdf"> </pdf> //分页 <div class="pagebutton"> <el-button size="mini" @click="changepage(0)" round>上一页</el-button> <span> {{currentpage}} / {{pagecount}} </span> <el-button size="mini" @click="changepage(1)" round>下一页</el-button> </div>
引入组件,定义变量
//vue文件内导入并引用 import pdf from "vue-pdf"; export default { components: { pdf, }, //定义变量 data(){ return { pdffile: "", //pdf文件地址 currentpage: 0, // 页码 pagecount: 0, // 总页数 } }, methods:{ // 翻页 changepage (val) { if (val === 0 && this.currentpage > 1) { this.currentpage --; } if (val === 1 && this.currentpage < this.pagecount) { this.currentpage ++; } }, // pdf加载时 loadpdf () { this.currentpage = 1 // 加载的时候先加载第一页 }, } }
vue-pdf实现pdf在线预览
1、首先安装vue-pdf ,在命令行中输入如下代码:
npm install --save vue-pdf
2、页面引用,新建index.vue
<template> <div class="ins-submit-docs-content ins-submit-docs-pdf"> <div v-if="loading" style="position: absolute; top: 40%; width: 100%;text-align: center;"> <van-loading type="spinner" color="#fc8955" /> </div> <van-empty description="文档加载失败" v-if="loadingerror" /> <pdf ref="morepdf" :src="src"></pdf> </div> </template>
<script> import vue from 'vue'; import pdf from 'vue-pdf' import { loading } from 'vant'; vue.use(loading); export default { name : 'ins-docs-pdf', props : { src : { type : string, //默认值,选中值 default : '' } }, data(){ return { loading : true, //加载中 loadingerror : false, //加载失败 } }, watch : { src : { deep : true, immediate: true, handler(val){ if(val){ this.getpdfnums(val) } } } }, components: { pdf }, methods:{ //计算pdf页码总数 getpdfnums(url) { this.loading = true //let loadurl = pdf.createloadingtask(url) let loadurl = pdf.createloadingtask({ url: url,//你的pdf地址 }) loadurl.promise.then(pdf => { this.$set(this, 'docspdf.numpages', pdf.numpages) this.loading = false }).catch(err => { this.loading = false; this.loadingerror = true; }) } } } </script>
3、当pdf 有很多页的时候,直接v-for 循环,直接显示完
<template> <div class="ins-submit-docs-content ins-submit-docs-pdf"> <div v-if="loading" style="position: absolute; top: 40%; width: 100%;text-align: center;"> <van-loading type="spinner" color="#fc8955" /> </div> <van-empty description="文档加载失败" v-if="loadingerror" /> <pdf ref="morepdf" :src="src" :page="i" v-for="i in numpages" :key="i"></pdf> </div> </template>
<script> import vue from 'vue'; import pdf from 'vue-pdf' import { loading } from 'vant'; vue.use(loading); export default { name : 'ins-docs-pdf', props : { src : { type : string, //默认值,选中值 default : '' } }, data(){ return { loading : true, //加载中 loadingerror : false, //加载失败 numpages : 0, } }, watch : { src : { deep : true, immediate: true, handler(val){ if(val){ this.getpdfnums(val) } } } }, components: { pdf }, methods:{ //计算pdf页码总数 getpdfnums(url) { this.loading = true //let loadurl = pdf.createloadingtask(url) let loadurl = pdf.createloadingtask({ url: url,//你的pdf地址 }) loadurl.promise.then(pdf => { this.numpages = pdf.numpages this.$set(this, 'docspdf.numpages', pdf.numpages) this.loading = false }).catch(err => { this.loading = false; this.loadingerror = true; }) } } } </script>
4、当pdf很大的时候,你会发现pdf加载回很慢,并且偶尔会跳出加载;
这时就用到了下边的代码;pdf分页展示;
并且解决pdf预览的时候偶尔中文会乱码,借用vue-pdf中cmapreaderfactory
<template> <div class="ins-submit-docs-content ins-submit-docs-pdf"> <div v-if="loading" style="position: absolute; top: 40%; width: 100%;text-align: center;"> <van-loading type="spinner" color="#fc8955" /> </div> <van-empty description="文档加载失败" v-if="loadingerror" /> <div v-show="numpages <= 50"> <pdf ref="morepdf" :src="src" :page="i" v-for="i in numpages" :key="i"></pdf> </div> <div v-show="numpages > 50"> <pdf ref="pdf" :src="src" :page="currentpage" @num-pages="numpages=$event" @loaded="loadpdfhandler"></pdf> <div class="ins-pdf-button-box"> <span @click.stop="prepage">上一页</span> <span>{{currentpage}}/{{numpages}}</span> <span @click.stop="nextpage">下一页</span> </div> </div> </div> </template>
<script> import vue from 'vue'; import pdf from 'vue-pdf' import cmapreaderfactory from 'vue-pdf/src/cmapreaderfactory.js'; import { loading } from 'vant'; vue.use(loading); export default { name : 'ins-docs-pdf', props : { src : { type : string, //默认值,选中值 default : '' } }, data(){ return { loading : true, //加载中 loadingerror : false, //加载失败 numpages : 0, //分页 currentpage : 1, //当前显示页数 } }, watch : { src : { deep : true, immediate: true, handler(val){ if(val){ this.getpdfnums(val) } } } }, components: { pdf }, methods:{ //计算pdf页码总数 getpdfnums(url) { this.loading = true //let loadurl = pdf.createloadingtask(url) let loadurl = pdf.createloadingtask({ url: url,//你的pdf地址 cmapreaderfactory }) loadurl.promise.then(pdf => { this.numpages = pdf.numpages this.currentpage = 1 this.$set(this, 'docspdf.numpages', pdf.numpages) this.loading = false }).catch(err => { this.loading = false; this.loadingerror = true; }) }, // 上一页 prepage() { var page = this.currentpage page = page > 1 ? page - 1 : this.numpages this.currentpage = page }, // 下一页 nextpage() { var page = this.currentpage page = page < this.numpages ? page + 1 : 1 this.currentpage = page }, // 回调 loadpdfhandler(e) { this.currentpage = e } } } </script>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论