亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue項目pdf(base64)轉圖片遇到的問題及解決方法

2019-11-19 12:40:07
字體:
來源:轉載
供稿:網友

公司有個業務需求,要求后臺傳pdf的base64編碼給前端,前端顯示到界面上,后來在網上搜索了很多關于base64轉pdf的文章,都寫的不是非常的詳細,在實現的過程中遇到很多坑,經過一天的研究終于實現了這個功能,分享一下我在這個功能中遇到的問題和解決方法

要注明的是這里用到的核心插件是pdf.js,原理是動態生成canvas標簽,然后通過pdf.js生成一個能渲染出pdf的對象,隨后渲染每個canvas,并且生成的pdf是畫面的形式,并沒有pdf之類的控件

引入插件

這里很多博客都是使用JavaScript原生的方法引入pdf.js,例如使用script標簽引入外部的js腳本,或者直接把pdf.js的源碼復制到項目中,但是我嘗試這些方法的時候都不是特別好用,而且引入后導致項目體積過于龐大,

隨后我去github上尋找通過包管理器引入pdf.js的方法,在pdf.js的github上官方說明的是用gulp如何使用pdf.js,但是對于npm來說并沒有詳細說明,終于我在字里行間發現了這么一句話

To use PDF.js in a web application you can choose to use a pre-built version of the library or to build it from source. We supply pre-built versions for usage with NPM and Bower under the pdfjs-dist name. For more information and examples please refer to the wiki page on this subject.

大致的意思就是如果使用npm包管理器或者bower的話,引入的名字為pdfjs-dist,那么我們使用npm的方法引入這個pdfjs-dist,引入的名字就隨意取名了這里我叫PDFJS

 import PDFJS from 'pdfjs-dist'

使用pdfjs-dist

這里后臺傳給我的是一個由pdf文件名字和pdf的base64編碼組成的對象的數組,我取名為pdfDataList

可以看到fileName是pdf的名字,fileVale是pdf文件的base64編碼,thumbnail是pdf縮略圖的base64編碼這里用不到先不管,之前說到需要動態生成canvas節點(這里不會canvas也不要緊,只需要根據代碼一步步做就能渲染canvas)

1.首先我們創建一個承載所有canvas節點的父節點,取名為pdfList

2.然后創建一個異步函數showPdf(不懂什么是異步函數的可以去查一下async/await,這里不用異步函數也可以使用promise.then的方法,但是async/await作為異步操作的終極方案最好還是學習一下)

async showPdf() {     }

使用querySelector選擇類名為pdfList的dom節點,隨后遍歷后臺傳過來的pdfDataList數組的每一項,這里用到一個瀏覽器自帶的atob()方法解碼base64,MDN上是這么解釋的:

你可以使用 window.btoa() 方法來編碼一個可能在傳輸過程中出現問題的數據,并且在接受數據之后,使用 atob() 方法再將數據解碼。

語法: var decodedData = scope.atob(encodedData);

隨后調用pdf.js插件的getDocument方法,getDocument是一個promise,所以使用異步函數的話前面需要加await關鍵字(不使用異步函數的話在方法后面加.then((pdf)=>{.......}),這個pdf對象和我這個pdf對象是同一個,同時這里暫時也沒考慮異步操作出錯的情況,有要求的話可以在加個catch捕獲錯誤)

getDocument方法的參數是一個對象,對象鍵名為data,值為base64解碼后的值,此方法返回一個pdf對象,這個對象有幾個屬性,可以打印出來觀察一下

這里我們先用到的是numPages屬性,它指的是當前pdf文件有多少頁

async showPdf() {    let pdfList = document.querySelector('.pdfList') //通過querySelector選擇DOM節點,使用document.getElementById()也一樣    for(let value of this.pdfDataList){ //遍歷后臺傳過來的pdfDataList      let base64 = value.fileValue //獲得bas464編碼      let decodedBase64 = atob(base64) //使用瀏覽器自帶的方法解碼      let pdf = await PDFJS.getDocument({data: decodedBase64}) //返回一個pdf對象      let pages = pdf.numPages //聲明一個pages變量等于當前pdf文件的頁數    }  }

獲取當前pdf文件的對象和當前pdf文件的所有頁數后,循環遍歷每個頁數,執行如下操作:

1)動態創建canvas節點
2)調用pdf對象原型上的getPage()方法和getViewport()方法,依次傳入當前循環的頁數和canvas的縮放大小(這里不懂的可以直接復制黏貼)
3)渲染當前的canvas節點
4)調用page對象的render()方法渲染當前頁,此方法也是一個promise,需要使用await關鍵字等到狀態為resolve后再執行之后的代碼
5)給顯示當前頁面的canvas節點一個className為canvas方便修改樣式,最后把這個canvas節點插入到pdfList節點中

async showPdf() {    let pdfList = document.querySelector('.pdfList') //通過querySelector選擇DOM節點,使用document.getElementById()也一樣    for(let value of this.pdfDataList){ //遍歷后臺傳過來的pdfDataList      let base64 = value.fileValue //獲得bas464編碼      let decodedBase64 = atob(base64) //使用瀏覽器自帶的方法解碼      let pdf = await PDFJS.getDocument({data: decodedBase64}) //返回一個pdf對象      let pages = pdf.numPages //聲明一個pages變量等于當前pdf文件的頁數      for (let i = 1; i <= pages; i++) { //循環頁數       let canvas = document.createElement('canvas')        let page = await pdf.getPage(i) //調用getPage方法傳入當前循環的頁數,返回一個page對象       let scale = 1;//縮放倍數,1表示原始大小       let viewport = page.getViewport(scale);        let context = canvas.getContext('2d'); //創建繪制canvas的對象       canvas.height = viewport.height; //定義canvas高和寬       canvas.width = viewport.width;       let renderContext = {        canvasContext: context,        viewport: viewport       };       await page.render(renderContext)       canvas.className = 'canvas' //給canvas節點定義一個class名,這里我取名為canvas       pdfList.appendChild(canvas) //插入到pdfList節點的最后      }    }  } 

至此頁面上就會多出一個canvas節點并且顯示當前pdf文件的第一頁的圖片,如果當前pdf文件有多頁就會渲染出多個canvas節點,有多個pdf文件就會先循環外層,然后再循環內層,把每個pdf文件的每一頁都生成一個canvas節點

 

修改樣式

渲染出頁面后還有個要注意的點,Vue框架會給每個組件的DOM節點生成一個自定義屬性,而節點動態生成的canvas節點,并沒有data-v-xxxxx這樣的自定義屬性

而Vue會給每個組件里面的樣式添加這個自定義屬性,Vue框架這樣做可以防止樣式的相互污染(也就是style旁邊的scoped屬性)

我們這里可以在這個style下面再創建一個style寫入樣式來達到修改canvas樣式的效果,但是記得這樣做你整個項目里面類名叫canvas的都會獲得這個樣式,需要注意

寫在最后

這里使用的是動態生成canvas節點然后渲染這個節點生成的圖片,然而直接使用createElement生成一個節點并且頻繁操作DOM會對性能有一定的影響,如果有更好的方法歡迎留言交流,感謝觀看。希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成自拍网站| 久久视频国产精品免费视频在线| 亚洲欧美制服综合另类| 欧美xxxx综合视频| 岛国av一区二区在线在线观看| 日本欧美在线视频| 国产精品美女主播在线观看纯欲| 97精品国产aⅴ7777| 欧美激情2020午夜免费观看| 久久99青青精品免费观看| 久热精品视频在线观看一区| 欧美成人在线免费| 国产精品日日摸夜夜添夜夜av| 成人做爰www免费看视频网站| 国产欧美精品一区二区三区-老狼| 一区二区三区视频免费| 欧美日韩在线视频观看| 久久综合久久美利坚合众国| 98精品国产高清在线xxxx天堂| 久久久久久尹人网香蕉| 日韩免费观看视频| 97超碰国产精品女人人人爽| 日韩在线观看高清| 欧美中文在线观看国产| 98精品国产高清在线xxxx天堂| 97欧美精品一区二区三区| 亚洲第一免费网站| 国产精品丝袜久久久久久不卡| 78色国产精品| 久久精品成人一区二区三区| 日韩av在线不卡| 久久精品久久久久电影| 91精品国产高清自在线| 欧美激情手机在线视频| 91中文字幕一区| 久热爱精品视频线路一| 国产97在线播放| 欧美日韩精品在线视频| 麻豆国产va免费精品高清在线| 国产精品美乳一区二区免费| 毛片精品免费在线观看| 久久久免费高清电视剧观看| 亚洲激情视频网| 68精品国产免费久久久久久婷婷| 97精品国产97久久久久久| 亚洲第一区中文字幕| 97久久精品在线| 国产精品老女人精品视频| 国产精品久久久久高潮| 一区二区三区亚洲| 懂色av影视一区二区三区| 亚洲xxx大片| 日韩中文字幕视频| 粉嫩av一区二区三区免费野| 亚洲摸下面视频| 中文日韩电影网站| 色综久久综合桃花网| 57pao成人国产永久免费| 欧美午夜精品久久久久久浪潮| 欧美激情国产日韩精品一区18| 精品亚洲精品福利线在观看| 国产精品成人av性教育| 91sao在线观看国产| 91情侣偷在线精品国产| 2021国产精品视频| 欧美性xxxx18| 欧美视频在线免费看| 中文字幕亚洲综合久久| 亚洲少妇中文在线| 亚洲免费电影一区| 国产免费一区二区三区在线观看| 色噜噜狠狠狠综合曰曰曰| 日韩av在线资源| 2018国产精品视频| 亚洲美女av黄| 91精品综合久久久久久五月天| 亚洲aa在线观看| 日韩在线视频线视频免费网站| 91av在线播放视频| 91国产精品91| 2019中文字幕在线| 亚洲丁香久久久| 色樱桃影院亚洲精品影院| 亚洲激情视频在线| 中文字幕亚洲一区| 国产www精品| 欧美电影在线观看完整版| 在线观看国产成人av片| 伊人久久大香线蕉av一区二区| 亚洲欧美日韩中文在线制服| 亚洲欧美日韩天堂| 成人国产精品久久久久久亚洲| 日韩中文字幕视频在线观看| 亚洲人成网在线播放| 中文字幕视频在线免费欧美日韩综合在线看| 日韩免费在线看| 中文字幕欧美日韩| 亚洲人成在线播放| 成人两性免费视频| 欧美另类在线观看| 北条麻妃99精品青青久久| 日韩欧美亚洲一二三区| 亚洲成色www8888| 日日摸夜夜添一区| 国产在线精品一区免费香蕉| 欧美成人激情视频免费观看| 日日骚久久av| 成人97在线观看视频| 成人激情电影一区二区| 中文字幕一区日韩电影| 国产精品久久久久久久久久久久久| 国产视频精品免费播放| 国内免费久久久久久久久久久| 亚洲国产精品专区久久| 中文字幕欧美日韩精品| 91精品视频观看| 尤物九九久久国产精品的分类| 国产精品久久久久久久久久久久久| 亚洲色图美腿丝袜| 欧美日韩午夜视频在线观看| 亚洲人成在线免费观看| 国产精品美女久久久久久免费| 色综合久久悠悠| 亚洲最大在线视频| 亚洲四色影视在线观看| 亚洲第一页自拍| 日韩精品小视频| 国产高清在线不卡| 国产一区二区三区在线免费观看| 成人激情视频在线播放| 日韩精品一二三四区| 欧美性在线观看| 精品久久久久久久久久久| 欧美电影免费在线观看| 亚洲欧洲黄色网| 欧美午夜精品久久久久久久| 日韩中文字幕欧美| 国产成+人+综合+亚洲欧美丁香花| 国产69久久精品成人看| 亚洲aⅴ日韩av电影在线观看| 亚洲精品国产拍免费91在线| 97在线观看视频国产| 91精品久久久久久久久久久久久| 深夜成人在线观看| 国产精品综合久久久| 国产精品香蕉在线观看| 亚洲欧美制服中文字幕| 91香蕉亚洲精品| 欧美激情视频在线| 大胆欧美人体视频| 亚洲第一精品夜夜躁人人爽| 国产999精品久久久影片官网| www.亚洲免费视频| 国产一区二区成人| 国产精品视频自在线| 97国产精品人人爽人人做| 国产精品视频播放| 91久久久久久久久| 国产精品偷伦免费视频观看的| 国产91精品久久久久| 国产福利精品av综合导导航| 视频一区视频二区国产精品| 国产精品稀缺呦系列在线| 亚洲第一福利视频|