如何用vue-pdf包實(shí)現(xiàn)pdf文件預(yù)覽,支持分頁(yè)
vue項(xiàng)目實(shí)現(xiàn)pdf文件預(yù)覽功能
下載vue-pdf包
npm install --save vue-pdf
template模板內(nèi)容:
//pdf組件
<pdf :src="pdfFile"
:page="currentPage"
@num-pages="pageCount=$event"
@page-loaded="currentPage=$event"
@loaded="loadPdf">
</pdf>
//分頁(yè)
<div class="pageButton">
<el-button size="mini" @click="changePage(0)" round>上一頁(yè)</el-button>
<span> {{currentPage}} / {{pageCount}} </span>
<el-button size="mini" @click="changePage(1)" round>下一頁(yè)</el-button>
</div>
引入組件,定義變量
//vue文件內(nèi)導(dǎo)入并引用
import pdf from "vue-pdf";
export default {
components: {
pdf,
},
//定義變量
data(){
return {
pdfFile: "", //pdf文件地址
currentPage: 0, // 頁(yè)碼
pageCount: 0, // 總頁(yè)數(shù)
}
},
methods:{
// 翻頁(yè)
changePage (val) {
if (val === 0 && this.currentPage > 1) {
this.currentPage --;
}
if (val === 1 && this.currentPage < this.pageCount) {
this.currentPage ++;
}
},
// pdf加載時(shí)
loadPdf () {
this.currentPage = 1 // 加載的時(shí)候先加載第一頁(yè)
},
}
}
vue-pdf實(shí)現(xiàn)pdf在線(xiàn)預(yù)覽
1、首先安裝vue-pdf ,在命令行中輸入如下代碼:
npm install --save vue-pdf
2、頁(yè)面引用,新建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, //默認(rèn)值,選中值
default : ''
}
},
data(){
return {
loading : true, //加載中
loadingError : false, //加載失敗
}
},
watch : {
src : {
deep : true,
immediate: true,
handler(val){
if(val){
this.getPDFnums(val)
}
}
}
},
components: {
pdf
},
methods:{
//計(jì)算pdf頁(yè)碼總數(shù)
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、當(dāng)PDF 有很多頁(yè)的時(shí)候,直接v-for 循環(huán),直接顯示完
<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, //默認(rèn)值,選中值
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:{
//計(jì)算pdf頁(yè)碼總數(shù)
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、當(dāng)PDF很大的時(shí)候,你會(huì)發(fā)現(xiàn)PDF加載回很慢,并且偶爾會(huì)跳出加載;
這時(shí)就用到了下邊的代碼;PDF分頁(yè)展示;
并且解決PDF預(yù)覽的時(shí)候偶爾中文會(huì)亂碼,借用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">上一頁(yè)</span>
<span>{{currentPage}}/{{numPages}}</span>
<span @click.stop="nextPage">下一頁(yè)</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, //默認(rèn)值,選中值
default : ''
}
},
data(){
return {
loading : true, //加載中
loadingError : false, //加載失敗
numPages : 0, //分頁(yè)
currentPage : 1, //當(dāng)前顯示頁(yè)數(shù)
}
},
watch : {
src : {
deep : true,
immediate: true,
handler(val){
if(val){
this.getPDFnums(val)
}
}
}
},
components: {
pdf
},
methods:{
//計(jì)算pdf頁(yè)碼總數(shù)
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;
})
},
// 上一頁(yè)
prePage() {
var page = this.currentPage
page = page > 1 ? page - 1 : this.numPages
this.currentPage = page
},
// 下一頁(yè)
nextPage() {
var page = this.currentPage
page = page < this.numPages ? page + 1 : 1
this.currentPage = page
},
// 回調(diào)
loadPdfHandler(e) {
this.currentPage = e
}
}
}
</script>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Vue實(shí)現(xiàn)PDF文件預(yù)覽的方法詳解
- vue-pdf如何通過(guò)文件流預(yù)覽pdf文件
- vue如何在線(xiàn)預(yù)覽各類(lèi)型文件
- vue預(yù)覽本地pdf文件方法之vue-pdf組件使用
- vue2.0如何借用vue-pdf實(shí)現(xiàn)在線(xiàn)預(yù)覽pdf文件
- 詳解vue2如何實(shí)現(xiàn)點(diǎn)擊預(yù)覽本地文件
- Vue如何實(shí)現(xiàn)文件預(yù)覽和下載功能的前端上傳組件
- Vue實(shí)現(xiàn)微信小程序中預(yù)覽文件的縮放功能
- vue3中做文件預(yù)覽的項(xiàng)目實(shí)踐
相關(guān)文章
Vue Router路由無(wú)法跳轉(zhuǎn)問(wèn)題匯總
這篇文章主要介紹了Vue Router路由無(wú)法跳轉(zhuǎn)問(wèn)題匯總,在這里我整理了部分Vue Router路由無(wú)法跳轉(zhuǎn)問(wèn)題,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
在項(xiàng)目中封裝axios的實(shí)戰(zhàn)過(guò)程
這篇文章主要給大家介紹了關(guān)于如何在項(xiàng)目中封裝axios的相關(guān)資料,axios 請(qǐng)求的封裝,無(wú)非是為了方便代碼管理,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
應(yīng)用provide與inject刷新Vue頁(yè)面方法
這篇文章主要介紹了應(yīng)用provide與inject刷新Vue頁(yè)面的兩種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,多多進(jìn)步,祝大家早日升職加薪2021-09-09
解決vuex改變了state的值,但是頁(yè)面沒(méi)有更新的問(wèn)題
這篇文章主要介紹了解決vuex改變了state的值,但是頁(yè)面沒(méi)有更新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Vue實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01

