vue如何使用pdf.js實現(xiàn)在線查看pdf文件功能
需求:
有一個列表頁,用戶點擊查看,彈層展示后臺接口返回的pdf內(nèi)容(不是文件、地址之類的,亂碼的pdf銘文(二進(jìn)制文件流))
1、pdf.js安裝
npm install --save vue-pdf
2、正文代碼
<template>
<div>
<el-table :data="dataList">
<el-table-column prop="fieldName" width="120" label="操作">
<template slot-scope="scope">
<span @click="look(scope.row)">查看</span>
</template>
</el-table-column>
</el-table>
<el-dialog title="預(yù)覽" :visible.sync="dialogVisible" :before-close="closePdf">
<pdf v-for="i in numPages" :key="i" :src="pdfSrc" :page="i" />
</el-dialog>
</div>
<template>
<script>
import pdf from 'vue-pdf'
export default {
components: {
pdf
},
data() {
return {
dialogVisible: false,
numPages: 1,
pdfSrc:"",
close:false,
}
},
methods: {
// 查看預(yù)覽
look(row) {
const that = this;
that.pdfSrc = "";
// 接口文件地址(接口入?yún)⑵闯鰜淼穆窂剑?
const url = `${Host}xxxxxx/xxxx/xxx?fileId=${row.fileId}&fileName=${row.fileName}.pdf`;
// 如果調(diào)用接口(接口的responseType一定要是blob,默認(rèn)json,不然解析出來的pdf是空白的)后拿的返回的值(亂碼的pdf銘文(二進(jìn)制文件流))則需要轉(zhuǎn)一下
// const url = window.URL.createObjectURL(new Blob([res]), { // res為接口返回值
// type: "application/msword"
// });
that.pdfSrc = pdf.createLoadingTask(url)
that.pdfSrc.promise.then(pdf => {
that.dialogVisible = true;
that.numPages = pdf.numPages
//保證pdf加載成功,否則不能關(guān)閉彈層
setTimeout(() => {
that.close = true;
}, 2000);
})
.catch(error => {
that.$message.error("無效的PDF文件!");
})
},
//此方法解決第一次查看pdf文字沒有加載完成影響后續(xù)查看
closePdf(done){
if(this.close) {
this.numPages = 1;//必須重置,多次查看會出現(xiàn)頭部內(nèi)容缺失
this.close = false;
done();
} else {
this.$message.warning("PDF文件加載中");
}
}
}
}
</script>
遇到的問題:
1、多次查看后頭部內(nèi)容不顯示。 設(shè)置numPages = 1;
2、上一條pdf查看沒有加載完成,下一條pdf查看pdfSrc清空了還是無法正常加載。 延遲關(guān)閉彈層(這個方法有點暴力,希望能找到好的解決方法);
3、頭部會有點多余內(nèi)容溢出,內(nèi)容沒啥,就是感覺有類似border的東西。 頭部其他內(nèi)容設(shè)置樣式蓋住(具體css略)。
在后續(xù)項目中又實現(xiàn)了該功能,沒有遇到以上問題,盲猜是因為pdf dialog標(biāo)簽上加了v-if,光設(shè)置visible.sync只會控制元素的顯示隱藏,不會重新渲染。
總結(jié):只要是dialog最好加上v-if,會避免很多問題。
拓展:
如果后端返回的是html格式,前端調(diào)用的接口responseType就不要用blob了,直接將返回結(jié)果放在v-html里面。例:
<div v-html="responseData"/>
總結(jié)
到此這篇關(guān)于vue如何使用pdf.js實現(xiàn)在線查看pdf文件功能的文章就介紹到這了,更多相關(guān)vue在線查看pdf文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue3+TypeScript項目中安裝PDF.js詳細(xì)的步驟
- vue中pdf.js的使用之pdf顯示、跳轉(zhuǎn)指定頁面及高亮關(guān)鍵詞
- Vue中使用pdf.js實現(xiàn)PDF文檔展示功能實例
- vue3使用pdf.js來預(yù)覽文件的操作步驟(本地文件測試)
- Vue使用PDF.js實現(xiàn)瀏覽pdf文件功能
- 使用Vue3+PDF.js實現(xiàn)PDF預(yù)覽功能
- vue使用pdf.js預(yù)覽pdf文件的方法
- Vue 集成 PDF.js 實現(xiàn) PDF 預(yù)覽和添加水印的步驟
- vue實現(xiàn)在線預(yù)覽pdf文件和下載(pdf.js)
- Vue中使用PDF.js的實戰(zhàn)指南
相關(guān)文章
vue3+el-select實現(xiàn)觸底加載更多功能(ts版)
這篇文章主要給大家介紹了基于vue3和el-select實現(xiàn)觸底加載更多功能,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以借鑒參考下2023-07-07
vue打包chunk-vendors.js文件過大導(dǎo)致頁面加載緩慢的解決
這篇文章主要介紹了vue打包chunk-vendors.js文件過大導(dǎo)致頁面加載緩慢的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
vue里面v-bind和Props 利用props綁定動態(tài)數(shù)據(jù)的方法
今天小編就為大家分享一篇vue里面v-bind和Props 利用props綁定動態(tài)數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
從入門到精通淺析Vue3內(nèi)存泄漏排查與性能優(yōu)化的工具指南
在單頁面應(yīng)用(SPA)無縫交互的背后,潛藏著一個常常被忽視的惡魔-內(nèi)存泄漏,本文將帶你深入了解Vue 3 的內(nèi)存世界,從響應(yīng)式系統(tǒng)的底層機制出發(fā),剖析泄漏根源,希望對大家有所幫助2025-12-12
element ui中表單el-form的label如何設(shè)置寬度
這篇文章主要介紹了element ui中表單el-form的label如何設(shè)置寬度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10

