vue項(xiàng)目展示pdf文件的方法實(shí)現(xiàn)
最近我有個(gè)需求,就是在h5頁面上展示pdf文件,分頁,最后一頁有個(gè)蒙層陰影漸變的效果,嘗試過一些插件,但都不是很好用,最后用了pdfjs-dist加上canvas 可以看下效果
先下載:
npm i pdfjs-dist@2.5.207
下面展示代碼 html:
<template> <canvas v-for="pageNumber in pageCount" :key="pageNumber" :id="`refCanvas${pageNumber}`" style="width: 100%; height: auto"></canvas> </template>
js:
<script> import workerSrc from 'pdfjs-dist/build/pdf.worker.entry' const PDFJS = require('pdfjs-dist') PDFJS.workerSrc = workerSrc export default { data() { return { url: '', pageCount: null, scale: 2, width: '', height: '', } }, mounted() { this.getPdfFile() }, methods: { async getPdfFile() { await apiName({ xxx:xxx }).then((res) => { var binaryData = []; binaryData.push(res); let url = window.URL.createObjectURL(new Blob(binaryData, { type: "application/pdf" })) this.url = url this._loadFile(url); }).catch((err) => { console.log('err', err) }) }, _loadFile (url) { // 獲取整個(gè) 文檔 PDFJS.getDocument({ url, cMapPacked: true }).promise.then(async (pdf) => { let pageCount = pdf.numPages this.pageCount = pageCount for (let i = 1; i <= pageCount; i++) { const page = await pdf.getPage(i) const viewport = page.getViewport({scale: this.scale}) const canvas = document.getElementById(`refCanvas${i}`); canvas.height = viewport.height canvas.width = viewport.width this.width = viewport.width this.height = viewport.height const renderContext = { canvasContext: canvas.getContext('2d'), viewport } page.render(renderContext).promise.then(() => { // 最后一頁pdf增加蒙層 if(i === pageCount) { this.addMask(i) } }) } },(err) => { if(err.name == 'MissingPDFException'){ console.log('無效的PDF鏈接') } }) }, // 添加蒙層 addMask(i) { const canvas = document.getElementById(`refCanvas${i}`); let ctx = canvas.getContext('2d') const gradient = ctx.createLinearGradient(0, this.height / 5, 0, this.height); gradient.addColorStop(0, "rgba(243, 244, 249, 0)"); gradient.addColorStop(0.2, "rgba(243, 244, 249, 0.3)"); gradient.addColorStop(0.4, "rgba(243, 244, 249, 0.7)"); gradient.addColorStop(0.5, "rgba(243, 244, 249, 0.9)"); gradient.addColorStop(0.6, "rgba(243, 244, 249, 1)"); gradient.addColorStop(0.8, "rgba(243, 244, 249, 1)"); gradient.addColorStop(1, "rgba(243, 244, 249, 1)"); ctx.fillStyle = gradient; ctx.fillRect (0, this.height / 5, this.width, (this.height / 5) * 4); } } } </script>
到此這篇關(guān)于vue項(xiàng)目展示pdf文件的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue展示pdf文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3如何使用provide實(shí)現(xiàn)狀態(tài)管理詳解
Vue3中有一對(duì)新增的api,provide和inject,熟悉Vue2的朋友應(yīng)該明,這篇文章主要給大家介紹了關(guān)于vue3如何使用provide實(shí)現(xiàn)狀態(tài)管理的相關(guān)資料,需要的朋友可以參考下2021-10-10vue項(xiàng)目通過a標(biāo)簽下載圖片至zip包的示例代碼
在vue項(xiàng)目中,將圖片下載可使用流的形式,下載成單個(gè)圖片,或者將多個(gè)圖片下載至zip包,本文就是介紹使用a標(biāo)簽下載圖片的用法,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10vue實(shí)現(xiàn)簡(jiǎn)單的MVVM框架
這篇文章給大家分享了基于vue實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MVVM框架的相關(guān)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2018-08-08Vue利用computed解決單項(xiàng)數(shù)據(jù)流的問題
Vue是一個(gè)非常流行和強(qiáng)大的前端框架,它讓我們可以用簡(jiǎn)潔和優(yōu)雅的方式來構(gòu)建用戶界面,但是,Vue也有一些需要注意和掌握的細(xì)節(jié)和技巧,今天我們來分享一個(gè)Vue中非常經(jīng)典的問題,也是一個(gè)非常實(shí)用的技巧,Vue利用computed解決單項(xiàng)數(shù)據(jù)流,需要的朋友可以參考下2023-08-08vue.nextTick()與setTimeout的區(qū)別及說明
這篇文章主要介紹了vue.nextTick()與setTimeout的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue和React中快速使用Electron的簡(jiǎn)單教程
Electron也可以快速地將你的網(wǎng)站打包成一個(gè)原生應(yīng)用發(fā)布,下面這篇文章主要給大家介紹了關(guān)于Vue和React中快速使用Electron的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05