vue如何使用pdf.js實(shí)現(xiàn)在線查看pdf文件功能
需求:
有一個列表頁,用戶點(diǎn)擊查看,彈層展示后臺接口返回的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)閉彈層(這個方法有點(diǎn)暴力,希望能找到好的解決方法);
3、頭部會有點(diǎn)多余內(nèi)容溢出,內(nèi)容沒啥,就是感覺有類似border的東西。 頭部其他內(nèi)容設(shè)置樣式蓋?。ň唧wcss略)。
在后續(xù)項(xiàng)目中又實(shí)現(xiàn)了該功能,沒有遇到以上問題,盲猜是因?yàn)閜df 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實(shí)現(xiàn)在線查看pdf文件功能的文章就介紹到這了,更多相關(guān)vue在線查看pdf文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-cli 3.x配置跨域代理的實(shí)現(xiàn)方法
這篇文章主要介紹了vue-cli 3.x配置跨域代理的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Vue中Layout內(nèi)部布局el-row、el-col的實(shí)現(xiàn)
layout是一種非常方便的布局方式,本文主要介紹了Vue中Layout內(nèi)部布局el-row、el-col的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-07-07VUE3+vite項(xiàng)目中動態(tài)引入組件與異步組件的詳細(xì)實(shí)例
在做vue3項(xiàng)目中時,每次使用都需要先進(jìn)行引入,下面這篇文章主要給大家介紹了關(guān)于VUE3+vite項(xiàng)目中動態(tài)引入組件與異步組件的相關(guān)資料,需要的朋友可以參考下2022-09-09vue全局掛載實(shí)現(xiàn)APP全局彈窗的示例代碼
本文主要介紹了vue全局掛載實(shí)現(xiàn)APP全局彈窗的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05vue2.0在沒有dev-server.js下的本地數(shù)據(jù)配置方法
這篇文章主要介紹了vue2.0在沒有dev-server.js下的本地數(shù)據(jù)配置方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02element-ui多文件上傳的實(shí)現(xiàn)示例
這篇文章主要介紹了element-ui多文件上傳的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04