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.dbjr.com.cn/article/272949.htm
總結(jié)
到此這篇關(guān)于vue通過url方式展示PDF的幾種方法的文章就介紹到這了,更多相關(guān)vue url方式展示PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn)
本文主要介紹了Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件
這篇文章主要介紹了vue如何實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下2021-01-01vue嵌套路由與404重定向?qū)崿F(xiàn)方法分析
這篇文章主要介紹了vue嵌套路由與404重定向?qū)崿F(xiàn)方法,結(jié)合實(shí)例形式分析了vue.js嵌套路由與404重定向的概念、原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-05-05Vue3使用ref和reactive管理狀態(tài)的代碼示例
ref 和 reactive 是 Composition API 中用來聲明響應(yīng)式數(shù)據(jù)的兩個(gè)核心函數(shù),在 Vue 3 中,使用 setup 語法糖可以更簡潔地使用這些功能,本文將探討如何使用 ref 和 reactive 來管理狀態(tài),并解釋它們之間的區(qū)別,需要的朋友可以參考下2024-09-09vue中如何給多個(gè)按鈕動(dòng)態(tài)添加類名
這篇文章主要介紹了vue中如何給多個(gè)按鈕動(dòng)態(tài)添加類名問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11