vue通過url方式展示PDF的幾種方法
最近vue項(xiàng)目中遇到預(yù)覽pdf出現(xiàn)亂碼問題,嘗試了各種辦法受盡折磨,以此記錄一下使用的幾種方法
1.使用pdfjs-dist 插件,通過iframe標(biāo)簽顯示
首先 npm install pdfjs-dist --save
npm直接下載插件 npm install --save pdfjs-dist@2.0.943,@2.0.943這是指定版本號,不需要指定版本的就不需要帶,下載后在使用的頁面直接引入。

然后直接設(shè)置pdf路徑就可以直接展示,downloadUrl 是插件中的viewer.html地址,resFile是文件下載地址,到此就能正常預(yù)覽PDF,組件功能也很多,如需要額外的功能也可以在viewer.js自行修改

2.使用vue-pdf插件
執(zhí)行下面命令下載插件(vue-pdf是基于pdfjs-dist),并修改pacakge.json文件
????????npm i pdfjs-dist@2.5.207 --save
????????npm i vue-pdf@4.2.0 --save
????????"dependencies": {
? ????????????????"pdfjs-dist": "2.5.207",
? ????????????????"vue-pdf": "4.2.0",
????????? }在使用的頁面中直接引入插件,標(biāo)簽為<pdf>就可以,路徑賦值同第一種方法

3.第三種方法使用了pdfjs-dist插件,通過url實(shí)現(xiàn)PDF轉(zhuǎn)圖片顯示
引入需要的插件pdfjs-dist,workerSrc(具體功能可以百度,沒搞明白)

本地文件URL:

通過URL轉(zhuǎn)換blob類型,然后轉(zhuǎn)為base64,這塊可以直接拿去用,getDay()方法可以換成自己想要的文件名,這個(gè)方法轉(zhuǎn)成base64后是包含前面類型的,又處理了一下,看個(gè)人需求
fileLinkToStreamDownload(url) {
let fileName = this.getDay()
let reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\/])+$/
if (!reg.test(url)) {
throw new Error('傳入?yún)?shù)不合法,不是標(biāo)準(zhǔn)的文件鏈接')
} else {
let xhr = new XMLHttpRequest()
xhr.open('get', url, true)
xhr.setRequestHeader('Content-Type', `application/pdf;charset-UTF-8`)
xhr.responseType = 'blob'
let that =this
xhr.onload = function() {
if (this.status == 200) {
//接受二進(jìn)制文件流
var blob = this.response
// that.downloadExportFile(blob, fileName);
that.blobToBase64(blob).then(res => {
// blob轉(zhuǎn)base64
let baseArr = res.split(',');
that.showPdf(baseArr[1]);
})
}
}
xhr.send()
}
},
//Blob類型轉(zhuǎn)BASE64
blobToBase64(blob) {
return new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.onload = (e) => {
resolve(e.target.result);
};
// readAsDataURL
fileReader.readAsDataURL(blob);
fileReader.onerror = () => {
reject(new Error('blobToBase64 error'));
};
});
},
getDay() {
let time = new Date(),
year = time.getFullYear(),
month = time.getMonth() + 1,
day = time.getDate(),
timeStem = time.getTime()
return `${year}/${month}/${day}/${timeStem}.pdf`
},拿到base64后,開始轉(zhuǎn)圖片處理:這個(gè)原理這里不多說了,也是照搬的, 如果PDFJS.getDocument()獲取不到pdf對象,可以考慮一下版本問題(@2.2.228親測好用)
async showPdf(base64Val) {
let pdfList = document.querySelector('.pdfList') //通過querySelector選擇DOM節(jié)點(diǎn),使用document.getElementById()也一樣
let base64 = base64Val //獲得bas464編碼
let decodedBase64 = window.atob(base64) //使用瀏覽器自帶的方法解碼
let pdfCurrent = await PDFJS.getDocument({data: decodedBase64}) //返回一個(gè)pdf對象
let pages = pdfCurrent.numPages //聲明一個(gè)pages變量等于當(dāng)前pdf文件的頁數(shù)
for (let i = 1; i <= pages; i++) { //循環(huán)頁數(shù)
let canvas = document.createElement('canvas')
let page = await pdfCurrent.getPage(i) //調(diào)用getPage方法傳入當(dāng)前循環(huán)的頁數(shù),返回一個(gè)page對象
let scale = 1;//縮放倍數(shù),1表示原始大小
let viewport = page.getViewport(scale);
let context = canvas.getContext('2d'); //創(chuàng)建繪制canvas的對象
canvas.height = viewport.height; //定義canvas高和寬
canvas.width = viewport.width;
let renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext)
canvas.className = 'canvas' //給canvas節(jié)點(diǎn)定義一個(gè)class名,這里我取名為canvas
pdfList.appendChild(canvas) //插入到pdfList節(jié)點(diǎn)的最后
}
},通過這個(gè)方法親測可以成功轉(zhuǎn)圖片,但是依舊沒解決圖片亂碼問題

4.直接通過iframe標(biāo)簽
頁面標(biāo)簽

還是通過轉(zhuǎn)碼,創(chuàng)建下載鏈接,直接給地址賦值皆可以了,#toolbar = 0 設(shè)置工具欄不顯示

我這塊需求是不能下載,只能打印,所以隱藏了工具欄,新增了打印按鈕,最開始想的是直接window.print()方法打印頁面,先看效果

只打印pdf界面右側(cè)的小圖(沒搞懂),然后決定使用print-js打印插件,還是npm install--save print-js 先下載插件
在需要的頁面直接引入

用法很簡單,按鈕綁定

直接用就可以,直接把地址附上,type是pdf類型就可以了

到這就實(shí)現(xiàn)了預(yù)覽,打印功能,但還沒找到獲取打印頁面按鈕的方法,有知道的可以交流。
期間還涉及到了vue父窗口,子窗口通信的問題,碰到同樣問題的可以看一下,附上圖片
父頁面

子頁面調(diào)用

地址如下
http://www.dhdzp.com/article/272949.htm
總結(jié)
到此這篇關(guān)于vue通過url方式展示PDF的幾種方法的文章就介紹到這了,更多相關(guān)vue url方式展示PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue require.context全局注冊組件的具體實(shí)現(xiàn)
本文主要介紹了vue require.context全局注冊組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
基于elementUI使用v-model實(shí)現(xiàn)經(jīng)緯度輸入的vue組件
這篇文章主要介紹了基于elementUI使用v-model實(shí)現(xiàn)經(jīng)緯度輸入的vue組件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
Vue3實(shí)現(xiàn)表單輸入的雙向綁定的示例代碼
Vue.js 是一個(gè)漸進(jìn)式的JavaScript框架,廣泛用于構(gòu)建交互式用戶界面,在 Vue 中,雙向綁定是一項(xiàng)非常核心的概念,尤其是在處理表單輸入時(shí),它使得數(shù)據(jù)和用戶界面之間的互動(dòng)變得簡單又高效,在本篇博客中,我們將深入探討如何在 Vue 3 中實(shí)現(xiàn)表單輸入的雙向綁定2025-01-01
Vue3的vite中圖片動(dòng)態(tài)加載3種方式
這篇文章主要給大家介紹了關(guān)于Vue3的vite中圖片動(dòng)態(tài)加載3種方式的相關(guān)資料,圖片進(jìn)入可視區(qū)域,進(jìn)行動(dòng)態(tài)加載圖片操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Vue3中Transition和TransitionGroup組件的使用及說明
本文將深入探討這兩個(gè)組件的作用,以及如何在實(shí)際項(xiàng)目中靈活運(yùn)用它們,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
解決vue項(xiàng)目中頁面調(diào)用數(shù)據(jù) 在數(shù)據(jù)加載完畢之前出現(xiàn)undefined問題
今天小編就為大家分享一篇解決vue項(xiàng)目中頁面調(diào)用數(shù)據(jù) 在數(shù)據(jù)加載完畢之前出現(xiàn)undefined問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Vue3使用transition實(shí)現(xiàn)組件切換的過渡效果
<Transition> 是一個(gè)內(nèi)置組件,這意味著它在任意別的組件中都可以被使用,無需注冊,它可以將進(jìn)入和離開動(dòng)畫應(yīng)用到通過默認(rèn)插槽傳遞給它的元素或組件上,本文介紹了Vue3使用transition實(shí)現(xiàn)組件切換的過渡效果,需要的朋友可以參考下2024-09-09
vue純前端實(shí)現(xiàn)將頁面導(dǎo)出為pdf和word文件
這篇文章主要為大家詳細(xì)介紹了vue如何通過純前端實(shí)現(xiàn)將頁面導(dǎo)出為pdf和word文件,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-01-01

