vue插件開(kāi)發(fā)之使用pdf.js實(shí)現(xiàn)手機(jī)端在線(xiàn)預(yù)覽pdf文檔的方法
目前大多數(shù)PC瀏覽器支持在線(xiàn)預(yù)覽pdf文件,但大多數(shù)手機(jī)瀏覽器還未支持,嘗試用手機(jī)瀏覽器打開(kāi)一個(gè)pdf文件會(huì)彈出是否下載的提示框。網(wǎng)上查了一些資料,在實(shí)現(xiàn)的過(guò)程中,還是走了比較多的彎路,最后采用了備受推薦的pdf.js插件來(lái)實(shí)現(xiàn)。
pdf.js可以從github上clone下來(lái),然后本地gulp生成可用的pdf.js和pdf.worker.js(參考readme即可)。
不過(guò)更簡(jiǎn)單的方法是使用cnpm來(lái)安裝: cnpm isntall --save pdfjs-dist,然后可以在項(xiàng)目中使用了,我使用插件的方式。具體使用示例:
pdf.vue
<template><p id="container"> <!-- <p class='pdf-page'> --> <canvas id="the-canvas"></canvas></p><p class="foot" v-if="pdfDoc"><button class="left" click="onPrevPage" v-if="pageNum>1">上一頁(yè)</button><button class="right" click="onNextPage" v-if="pageNum<pdfDoc.numPages">下一頁(yè)</button></p> <!-- </p> --><p></p> </template> <script> import PDFJS from 'pdfjs-dist' export default { data () { return { pdfDoc: null, pageNum: 1, pageRendering: false, pageNumPending: null, scale: 0.9 } }, methods: { showPDF (url) { 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">#container { background-color: rgba(0,0,0,0.75); position:fixed; width: 100%; height: 100%; top: 0; left: 0; text-align: center; padding: 5px; } .pdf-page { } .foot { position: fixed; transform: translate(-50%,0); left: 50%; }</style>
index.js:
import PDF from './PDF' var $vm export 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) } } }
把兩個(gè)文件放到同一文件夾pdf中形成一個(gè)插件,在main.js引入并use:
import pdf from '@/components/pdf' Vue.use(pdf)
這樣,在需要顯示pdf的地方調(diào)用vue的$showPDF方法即可。
效果顯示(手機(jī)瀏覽器驗(yàn)證顯示正常):
不過(guò)需要注意一點(diǎn)問(wèn)題是:
pdf.js不能處理跨域文件和本地文件,所以本地調(diào)試的時(shí)候應(yīng)該請(qǐng)求服務(wù)器的文件,如果請(qǐng)求的是遠(yuǎn)程服務(wù)器,存在跨域,那就需要在config/index.js中配置一下代理:
// ... proxyTable: { '/media': { target: 'https://xxxx.cn', // 換成正確的服務(wù)器域名 changeOrigin: true, pathRewrite: { '^/media': '/media' } } } // ...
然后在使用的地方填相對(duì)路徑即可:
// ... mounted () { this.$showPDF('/media/up/2018/3/9/494079c7ec333bd371798dd0a73c0a0b.pdf') } // ...
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue實(shí)現(xiàn)在線(xiàn)預(yù)覽pdf文件和下載(pdf.js)
- vue使用pdf.js預(yù)覽pdf文件的方法
- Vue實(shí)現(xiàn)在線(xiàn)預(yù)覽pdf文件功能(利用pdf.js/iframe/embed)
- vue3使用pdf.js來(lái)預(yù)覽文件的操作步驟(本地文件測(cè)試)
- Vue 集成 PDF.js 實(shí)現(xiàn) PDF 預(yù)覽和添加水印的步驟
- Vue使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能
- 使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能
- Vue中使用pdf.js實(shí)現(xiàn)PDF文檔展示功能實(shí)例
相關(guān)文章
在VUE3中禁止網(wǎng)頁(yè)返回到上一頁(yè)的方法
這篇文章主要介紹了在VUE3中如何禁止網(wǎng)頁(yè)返回到上一頁(yè),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09vue如何設(shè)置動(dòng)態(tài)的柵格占位、水平偏移量、類(lèi)名、樣式
這篇文章主要介紹了vue如何設(shè)置動(dòng)態(tài)的柵格占位、水平偏移量、類(lèi)名、樣式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Element?UI?Upload?組件上傳圖片可刪除、預(yù)覽功能
這篇文章主要介紹了Element?UI?Upload?組件?上傳圖片可刪除、預(yù)覽,設(shè)置只允許上傳單張?/?多張圖片的操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11vue2.0開(kāi)發(fā)實(shí)踐總結(jié)之疑難篇
這篇文章主要為大家總結(jié)了vue2.0開(kāi)發(fā)實(shí)踐的疑難,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12vue3使用Electron打包成exe的方法與打包報(bào)錯(cuò)解決
在前端開(kāi)發(fā)中,Electron是一種常用的工具,它允許開(kāi)發(fā)者使用Web技術(shù)構(gòu)建桌面應(yīng)用程序,本文主要介紹了vue3使用Electron打包成exe的方法與打包報(bào)錯(cuò)解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06vue3中使用viewerjs實(shí)現(xiàn)圖片預(yù)覽效果的項(xiàng)目實(shí)踐
viewer.js是一款開(kāi)源的圖片預(yù)覽插件,功能十分強(qiáng)大,本文主要介紹了vue3中使用viewerjs實(shí)現(xiàn)圖片預(yù)覽效果的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09vue+element使用動(dòng)態(tài)加載路由方式實(shí)現(xiàn)三級(jí)菜單頁(yè)面顯示的操作
這篇文章主要介紹了vue+element使用動(dòng)態(tài)加載路由方式實(shí)現(xiàn)三級(jí)菜單頁(yè)面顯示的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08vue?請(qǐng)求后端數(shù)據(jù)的示例代碼
在vue中,我們?nèi)绾瓮ㄟ^(guò)請(qǐng)求接口來(lái)訪(fǎng)問(wèn)后端的數(shù)據(jù)呢?在這里簡(jiǎn)單總結(jié)了一個(gè)小示例,對(duì)vue請(qǐng)求后端數(shù)據(jù)實(shí)例代碼感興趣的朋友一起看看吧2022-09-09