vue中如何實(shí)現(xiàn)pdf文件預(yù)覽的方法
今天產(chǎn)品提出一個(gè)優(yōu)化的需求,就是之前我們做的圖片展示就是一個(gè)img標(biāo)簽搞定,由于我們做的是海外后臺(tái)管理系統(tǒng),那邊的人上傳的文件時(shí)pdf格式,vue本事是不支持這種格式文件展示的,于是就google搜索,發(fā)現(xiàn)有iframe、embed、vueshowpdf(測(cè)試了不咋好用)、pdf等,本文說一下pdf插件的使用過程。
說明:iframe標(biāo)簽這種,對(duì)于有的鏈接是可以的,比如這種鏈接在服務(wù)器端沒有設(shè)置享有頭content-disposition,就可以直接顯示,如下:

想復(fù)制代碼如下:
<iframe src="http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf" width="100%" height="100%"> This browser does not support PDFs. Please download the PDF to view it: <a href="/test.pdf" rel="external nofollow" >Download PDF</a> </iframe>
顯示效果如下:

如果pdf有很多頁,也不用考慮分頁功能,自動(dòng)可以向下滑動(dòng)就翻頁,看著挺好,但是,且往下繼續(xù)看----->
我們把上邊的鏈接換成' https://ecs7.tokopedia.net/instant-loan/file/29a2218e-bef9-44cb-b92b-8e81bc4d5228_DOC-20171013-WA0035.pdf ',發(fā)現(xiàn)什么了?快看截圖。。。同樣是pdf鏈接,怎么這個(gè)就不行?

什么情況,下載框,必須下載才能看到,那多影響體驗(yàn),下到本地還占我磁盤,不行不行,把上邊那個(gè)連接放到瀏覽器,回車看一下響應(yīng)頭部:
content-disposition :attachment; filename="DOC-20171013-WA0035.pdf"
就是它,讓我們必須彈出下載框,由于這些文件是在遠(yuǎn)程服務(wù)器上存貯著,想著讓后端看能不能檢測(cè)到這個(gè)響應(yīng)頭,他們也懶得處理,后來只能自己處理了,鑒于這種情況,網(wǎng)上也是有很多解決辦法的,本人試驗(yàn)過可以的。中間也是借用了一篇文章 ,根據(jù)自己需求,做了簡(jiǎn)單的處理。
http://www.dbjr.com.cn/article/143646.htm
過程如下:
- 執(zhí)行npm install pdf-dist --save
- 在comments目錄下創(chuàng)建兩個(gè)文件:pdf.vue 和 index.js
< !--pdf.vue--><template >
<div id = "container": class = "{'back': isShow}" >
<canvas id = "the-canvas" >
</canvas>
<!-- / / 添加關(guān)閉pdf功能-->
<span: class = "{'close':isShow}"@click = "closePdf" > close < /span>
<p class="foot" v-if="pdfDoc">
<Button class="left" @click="onPrevPage" v-if="pageNum>1">上一頁</Button >
<Button class = "right"@click = "onNextPage"v -if = "pageNum<pdfDoc.numPages" > 下一頁 < /Button>
</p >
</div>
</template >
<script >
import PDFJS from 'pdfjs-dist'export
default {
data() {
return {
isShow:
false,
//通過該屬性動(dòng)態(tài)添加類,讓pdf顯示或隱藏
pdfDoc: null,
//可以打印發(fā)現(xiàn)是一個(gè)對(duì)象,里面有頁數(shù)信息等
pageNum: 1,
pageRendering: false,
pageNumPending: null,
scale: 0.9
}
},
methods: {
closePdf() {
this.isShow = false
},
showPDF(url) {
this.isShow = true let _this = this PDFJS.getDocument(url).then(function(pdf) {
_this.pdfDoc = pdf
_this.renderPage(1)
})
},
renderPage(num) {
this.pageRendering = true let _this = this this.pdfDoc.getPage(num).then(function(page) {
var viewport = page.getViewport(_this.scale) let canvas = document.getElementById('the-canvas') canvas.height = viewport.height canvas.width = viewport.width // Render PDF page into canvas context
var renderContext = {
canvasContext: canvas.getContext('2d'),
viewport: viewport
}
var renderTask = page.render(renderContext) // Wait for rendering to finish
renderTask.promise.then(function() {
_this.pageRendering = false
if (_this.pageNumPending !== null) {
// New page rendering is pending
this.renderPage(_this.pageNumPending) _this.pageNumPending = null
}
})
})
},
queueRenderPage(num) {
if (this.pageRendering) {
this.pageNumPending = num
} else {
this.renderPage(num)
}
},
onPrevPage() {
if (this.pageNum <= 1) {
return
}
this.pageNum--this.queueRenderPage(this.pageNum)
},
onNextPage() {
if (this.pageNum >= this.pdfDoc.numPages) {
return
}
this.pageNum++this.queueRenderPage(this.pageNum)
}
}
}
< /script>
<style scoped="" type="text/css ">
.back {
background-color: rgba(0, 0, 0, 0.788); position:fixed;
width: 100%;
height: 100%;
top: 0; left: 0;
text-align: center;
padding: 20px;
z-index: 100;
overflow: scroll;
}
.close{
position: absolute;
right: 20px;
top: 20px;
z-index: 200;
color: #fff;
cursor: pointer;
}
.foot {
position: absolute;
bottom: 50px;
left: 50%;
transform: translate(-50%,0);
}
</style>"
// index.js
import PDF from './pdf'
var $vmexport
default {
install(Vue, options) {
if (!$vm) {
const PDFPlugin = Vue.extend(PDF)
$vm = new PDFPlugin().$mount()
document.body.appendChild($vm.$el)
}
Vue.prototype.$showPDF = function(url) {
$vm.showPDF(url)
}
}
}
3. 在main.js中引入
import pdf from './components/pdf' Vue.use(pdf)
這樣就可以全局使用了,使用的時(shí)候就直接使用,本文是在一個(gè)圖片展示 的地方加上一個(gè)點(diǎn)擊事件,點(diǎn)擊時(shí)觸發(fā)該函數(shù)即可;
function showPdf() {
let url = 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf'
// let url = 'https://ecs7.tokopedia.net/instant-loan/file/29a2218e-bef9-44cb-b92b-8e81bc4d5228_DOC-20171013-WA0035.pdf'
this.$showPDF(url)
}
文中添加了關(guān)閉功能,點(diǎn)擊close即可關(guān)閉pdf的展示, 同時(shí)組件中也有分頁功能,如果頁數(shù)大于1就會(huì)顯示下一頁按鈕;

以上既是本人實(shí)現(xiàn)的過程,至于跨域問題,我這邊還沒遇到,現(xiàn)在是本地訪問可以的,等到線上再看看行不行,如果不行后邊再追加方法實(shí)現(xiàn)。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue中如何實(shí)現(xiàn)在線預(yù)覽word文件、excel文件
- vue實(shí)現(xiàn)在線預(yù)覽pdf文件和下載(pdf.js)
- vue使用pdf.js預(yù)覽pdf文件的方法
- vue3如何實(shí)現(xiàn)PDF文件在線預(yù)覽功能
- vue預(yù)覽 pdf、word、xls、ppt、txt文件的實(shí)現(xiàn)方法
- Vue3 + Vue-PDF 實(shí)現(xiàn)PDF 文件在線預(yù)覽實(shí)戰(zhàn)
- Vue實(shí)現(xiàn)在線預(yù)覽pdf文件功能(利用pdf.js/iframe/embed)
- Vue實(shí)現(xiàn)預(yù)覽docx/xlsx/pdf等類型文件功能
- vue3中各種類型文件進(jìn)行預(yù)覽功能實(shí)例
- vue中實(shí)現(xiàn)支持txt,docx,xlsx,mp4格式文件預(yù)覽功能(純前端)
相關(guān)文章
vue3.0中使用websocket,封裝到公共方法的實(shí)現(xiàn)
這篇文章主要介紹了vue3.0中使用websocket,封裝到公共方法的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue移動(dòng)端城市三級(jí)聯(lián)動(dòng)組件使用詳解
這篇文章主要為大家詳細(xì)介紹了vue移動(dòng)端城市三級(jí)聯(lián)動(dòng)組件的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
分享一個(gè)vue項(xiàng)目“腳手架”項(xiàng)目的實(shí)現(xiàn)步驟
這篇文章主要介紹了分享一個(gè)vue項(xiàng)目“腳手架”項(xiàng)目的實(shí)現(xiàn)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
vue項(xiàng)目history模式刷新404問題解決辦法
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目history模式刷新404問題的解決辦法,需要的朋友可以參考下2023-11-11

