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>总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论