vue項(xiàng)目展示pdf文件的方法實(shí)現(xiàn)
最近我有個(gè)需求,就是在h5頁(yè)面上展示pdf文件,分頁(yè),最后一頁(yè)有個(gè)蒙層陰影漸變的效果,嘗試過(guò)一些插件,但都不是很好用,最后用了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(() => {
// 最后一頁(yè)pdf增加蒙層
if(i === pageCount) {
this.addMask(i)
}
})
}
},(err) => {
if(err.name == 'MissingPDFException'){
console.log('無(wú)效的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)文章
axios無(wú)法加載響應(yīng)數(shù)據(jù):no?data?found?for?resource?with?given?i
最近在在做一個(gè)小查詢功能的時(shí)候踩了一個(gè)坑,所以這篇文章主要給大家介紹了關(guān)于axios無(wú)法加載響應(yīng)數(shù)據(jù):no?data?found?for?resource?with?given?identifier報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2022-11-11
vue項(xiàng)目實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方法
這篇文章主要給大家分享的是vue項(xiàng)目實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方法,vue-router是前端開(kāi)發(fā)中用來(lái)實(shí)現(xiàn)路由頁(yè)面跳轉(zhuǎn)的一個(gè)模塊。下面小編將帶來(lái)如何在已經(jīng)創(chuàng)建好的vue-router項(xiàng)目基礎(chǔ)下實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),需要的朋友可以參考一下2021-11-11
vue 封裝 Adminlte3組件的實(shí)現(xiàn)
這篇文章主要介紹了vue 封裝 Adminlte3組件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Vue.extend 登錄注冊(cè)模態(tài)框的實(shí)現(xiàn)
這篇文章主要介紹了Vue.extend 登錄注冊(cè)模態(tài)框的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
vue-router 源碼實(shí)現(xiàn)前端路由的兩種方式
這篇文章主要介紹了vue-router 源碼實(shí)現(xiàn)前端路由的兩種方式,主要介紹Hash 路由和History 路由,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
vue.js實(shí)現(xiàn)一個(gè)瀑布流的組件
這篇文章主要為大家介紹了vue.js實(shí)現(xiàn)一個(gè)瀑布流的組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

