欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue通過url方式展示PDF的幾種方法

 更新時(shí)間:2023年01月17日 09:42:57   作者:今天的磚格外燙手.  
小編最近接手的項(xiàng)目中有個(gè)需求,前端顯示后端返回的PDF格式的文件,下面這篇文章主要給大家介紹了關(guān)于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提供的三種調(diào)試方式你知道嗎

    Vue提供的三種調(diào)試方式你知道嗎

    這篇文章主要為大家介紹了Vue提供的三種調(diào)試方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Vite代理如何解決跨域問題詳解

    Vite代理如何解決跨域問題詳解

    跨域是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實(shí)施的安全限制,下面這篇文章主要給大家介紹了關(guān)于Vite代理如何解決跨域問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn)

    Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn)

    本文主要介紹了Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Vue?cli及Vue?router實(shí)例詳解

    Vue?cli及Vue?router實(shí)例詳解

    vue-cli是vue官方出品的快速構(gòu)建單頁應(yīng)用的腳手架,里面集成了webpack,npm,nodejs,babel,vue,vue-router,這篇文章主要介紹了Vue?cli及Vue?router詳解,需要的朋友可以參考下
    2022-08-08
  • vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件

    vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件

    這篇文章主要介紹了vue如何實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • Vue3中組件數(shù)據(jù)通信方式總結(jié)

    Vue3中組件數(shù)據(jù)通信方式總結(jié)

    如果在面試中,面試官問你Vue組件之間有哪些數(shù)據(jù)通信方式,你會(huì)怎么回復(fù),不要擔(dān)心,本文為大家整理了超全的Vue3中組件數(shù)據(jù)通信方式,需要的小伙伴快收藏起來吧
    2023-06-06
  • vue嵌套路由與404重定向?qū)崿F(xiàn)方法分析

    vue嵌套路由與404重定向?qū)崿F(xiàn)方法分析

    這篇文章主要介紹了vue嵌套路由與404重定向?qū)崿F(xiàn)方法,結(jié)合實(shí)例形式分析了vue.js嵌套路由與404重定向的概念、原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Vue3使用ref和reactive管理狀態(tài)的代碼示例

    Vue3使用ref和reactive管理狀態(tài)的代碼示例

    ref 和 reactive 是 Composition API 中用來聲明響應(yīng)式數(shù)據(jù)的兩個(gè)核心函數(shù),在 Vue 3 中,使用 setup 語法糖可以更簡潔地使用這些功能,本文將探討如何使用 ref 和 reactive 來管理狀態(tài),并解釋它們之間的區(qū)別,需要的朋友可以參考下
    2024-09-09
  • vue?v-for中key的原理詳析

    vue?v-for中key的原理詳析

    key屬性可以用來提升v-for渲染的效率,vue中使用v-for渲染數(shù)據(jù)的時(shí)候,并不會(huì)去改變原有的元素和數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于vue?v-for中key原理的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • vue中如何給多個(gè)按鈕動(dòng)態(tài)添加類名

    vue中如何給多個(gè)按鈕動(dòng)態(tài)添加類名

    這篇文章主要介紹了vue中如何給多個(gè)按鈕動(dòng)態(tài)添加類名問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論