最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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這是指定版本號(hào),不需要指定版本的就不需要帶,下載后在使用的頁面直接引入。

 然后直接設(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對(duì)象,可以考慮一下版本問題(@2.2.228親測(cè)好用)

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對(duì)象
      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對(duì)象
        let scale = 1;//縮放倍數(shù),1表示原始大小
        let viewport = page.getViewport(scale); 
        let context = canvas.getContext('2d'); //創(chuàng)建繪制canvas的對(duì)象
        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è)方法親測(cè)可以成功轉(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 先下載插件 

在需要的頁面直接引入

 用法很簡(jiǎn)單,按鈕綁定

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

到這就實(shí)現(xiàn)了預(yù)覽,打印功能,但還沒找到獲取打印頁面按鈕的方法,有知道的可以交流。

期間還涉及到了vue父窗口,子窗口通信的問題,碰到同樣問題的可以看一下,附上圖片

父頁面

子頁面調(diào)用

 地址如下

http://m.fzitv.net/article/272949.htm

總結(jié)

到此這篇關(guān)于vue通過url方式展示PDF的幾種方法的文章就介紹到這了,更多相關(guān)vue url方式展示PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue+G6圖形化實(shí)現(xiàn)功能示例

    vue+G6圖形化實(shí)現(xiàn)功能示例

    這篇文章主要為大家介紹了vue+G6圖形化實(shí)現(xiàn)功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • vue require.context全局注冊(cè)組件的具體實(shí)現(xiàn)

    vue require.context全局注冊(cè)組件的具體實(shí)現(xiàn)

    本文主要介紹了vue require.context全局注冊(cè)組件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(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組件

    這篇文章主要介紹了基于elementUI使用v-model實(shí)現(xiàn)經(jīng)緯度輸入的vue組件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Vue3實(shí)現(xiàn)表單輸入的雙向綁定的示例代碼

    Vue3實(shí)現(xiàn)表單輸入的雙向綁定的示例代碼

    Vue.js 是一個(gè)漸進(jìn)式的JavaScript框架,廣泛用于構(gòu)建交互式用戶界面,在 Vue 中,雙向綁定是一項(xiàng)非常核心的概念,尤其是在處理表單輸入時(shí),它使得數(shù)據(jù)和用戶界面之間的互動(dòng)變得簡(jiǎn)單又高效,在本篇博客中,我們將深入探討如何在 Vue 3 中實(shí)現(xiàn)表單輸入的雙向綁定
    2025-01-01
  • Vue3的vite中圖片動(dòng)態(tài)加載3種方式

    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組件的使用及說明

    Vue3中Transition和TransitionGroup組件的使用及說明

    本文將深入探討這兩個(gè)組件的作用,以及如何在實(shí)際項(xiàng)目中靈活運(yùn)用它們,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • vue簡(jiǎn)易記事本開發(fā)詳解

    vue簡(jiǎn)易記事本開發(fā)詳解

    這篇文章主要為大家詳細(xì)介紹了vue簡(jiǎn)易記事本的開發(fā)過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 解決vue項(xiàng)目中頁面調(diào)用數(shù)據(jù) 在數(shù)據(jù)加載完畢之前出現(xiàn)undefined問題

    解決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à)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue3使用transition實(shí)現(xiàn)組件切換的過渡效果

    Vue3使用transition實(shí)現(xiàn)組件切換的過渡效果

    <Transition> 是一個(gè)內(nèi)置組件,這意味著它在任意別的組件中都可以被使用,無需注冊(cè),它可以將進(jìn)入和離開動(dòng)畫應(yīng)用到通過默認(rèn)插槽傳遞給它的元素或組件上,本文介紹了Vue3使用transition實(shí)現(xiàn)組件切換的過渡效果,需要的朋友可以參考下
    2024-09-09
  • vue純前端實(shí)現(xiàn)將頁面導(dǎo)出為pdf和word文件

    vue純前端實(shí)現(xiàn)將頁面導(dǎo)出為pdf和word文件

    這篇文章主要為大家詳細(xì)介紹了vue如何通過純前端實(shí)現(xiàn)將頁面導(dǎo)出為pdf和word文件,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-01-01

最新評(píng)論

浦城县| 唐海县| 武隆县| 阿克陶县| 丹东市| 乌海市| 福海县| 宾川县| 河北省| 八宿县| 浠水县| 靖西县| 益阳市| 巫山县| 南昌市| 民丰县| 连南| 伊通| 桂阳县| 缙云县| 林芝县| 崇明县| 五峰| 平潭县| 弥渡县| 东阳市| 遂宁市| 永清县| 咸宁市| 庆城县| 仙桃市| 宣威市| 承德县| 法库县| 田林县| 西乡县| 务川| 娄底市| 正定县| 宿州市| 独山县|