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

Vue實現(xiàn)docx、pdf格式文件在線預(yù)覽功能

 更新時間:2022年09月22日 14:11:14   作者:iam_see  
在業(yè)務(wù)中,如果遇到文檔管理類的功能,會出現(xiàn)需要在線預(yù)覽的業(yè)務(wù)需求,本文主要是通過第三方庫來實現(xiàn)文檔預(yù)覽功能,并將其封裝成preview組件,感興趣的可以了解一下

介紹

在業(yè)務(wù)中,如果遇到文檔管理類的功能,會出現(xiàn)需要在線預(yù)覽的業(yè)務(wù)需求,本文主要是通過第三方庫來實現(xiàn)文檔預(yù)覽功能,并將其封裝成preview組件

docx

docx的實現(xiàn)需要使用docx-preview插件

安裝

npm i docx-preview

使用

創(chuàng)建一個容器標(biāo)簽

<div ref="file" v-show="extend == 'docx'"></div>

引入并創(chuàng)建渲染函數(shù)

import { renderAsync } from "docx-preview";
renderDocx() {
      renderAsync(this.fileData, this.$refs.file, null, {
        className: "docx", //默認(rèn)和文檔樣式類的類名/前綴
        inWrapper: true, //啟用圍繞文檔內(nèi)容呈現(xiàn)包裝器
        ignoreWidth: false, //禁用頁面的渲染寬度
        ignoreHeight: false, //禁用頁面的渲染高度
        ignoreFonts: false, //禁用字體渲染
        breakPages: true, //在分頁符上啟用分頁
        ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分頁
        experimental: false, //啟用實驗功能(制表符停止計算)
        trimXmlDeclaration: true, //如果為true,則在解析之前將從xml文檔中刪除xml聲明
        useBase64URL: false, //如果為true,圖像、字體等將轉(zhuǎn)換為base 64 URL,否則使用URL.createObjectURL
        useMathMLPolyfill: false, //包括用于鉻、邊等的MathML多填充。
        showChanges: false, //啟用文檔更改的實驗渲染(插入/刪除)
        debug: false, //啟用額外的日志記錄
      });
    },

PDF

pdf的預(yù)覽需要使用PDFJS這個插件,通過將文件流解析寫到canvas上實現(xiàn)預(yù)覽效果

安裝

npm i pdfjs-dist

引入和使用

<canvas
  v-for="num in numPages"
  :key="num"
  :id="'canvas_' + num"
  class="canvas"
></canvas>

此處pdf的渲染數(shù)據(jù)this.fileData必須是一個ArrayBuffer格式的數(shù)據(jù),如果請求的的數(shù)據(jù)是Blob格式必須要先使用Blob.arrayBuffer()轉(zhuǎn)換

async renderPdf(num = 1) {
      this.fileData.getPage(num).then(page => {
        // 設(shè)置canvas相關(guān)的屬性
        const canvas = document.getElementById("canvas_" + num);
        const ctx = canvas.getContext("2d");
        const dpr = window.devicePixelRatio || 1;
        const bsr =
          ctx.webkitBackingStorePixelRatio ||
          ctx.mozBackingStorePixelRatio ||
          ctx.msBackingStorePixelRatio ||
          ctx.oBackingStorePixelRatio ||
          ctx.backingStorePixelRatio ||
          1;
        const ratio = dpr / bsr;
        const viewport = page.getViewport({ scale: this.pdfScale }); // 設(shè)置放縮比率
        canvas.width = viewport.width * ratio;
        canvas.height = viewport.height * ratio;
        canvas.style.width = viewport.width + "px";
        canvas.style.height = viewport.height + "px";
        ctx.setTransform(ratio, 0, 0, ratio, 0, 0);
        const renderContext = {
          canvasContext: ctx,
          viewport: viewport,
        };
        // 數(shù)據(jù)渲染到canvas畫布上
        page.render(renderContext);
        if (this.numPages > num) {
          setTimeout(() => {
            return this.renderPdf(num + 1);
          });
        }
      });
    },

pdf的放大和縮小

pdf文件渲染后如果不能調(diào)整大小會因為源文件的大小和文件內(nèi)容,出現(xiàn)模糊的問題,所以進行縮放渲染是有必要的

// pdf放大
setPdfZoomin() {
  const max = 2;
  if (this.pdfScale >= max) {
    return;
  }
  this.pdfScale = this.pdfScale + 0.2;
  this.renderPdf();
},
// pdf縮小
setPdfZoomout() {
  const min = 0.6;
  if (this.pdfScale <= min) {
    return;
  }
  this.pdfScale = this.pdfScale - 0.1;
  this.renderPdf();
},

多格式的文件渲染函數(shù)映射

因為將多種文件渲染放在一個文件中,所以處理函數(shù)需要做映射處理,執(zhí)行對應(yīng)格式的文件渲染

renderPreview(extend) {
    const handle = {
    docx: () => {
      this.extend = "docx";
      this.$nextTick(() => this.renderDocx());
    },
    pdf: () => {
      this.extend = "pdf";
      new Blob([this.fileData]).arrayBuffer().then(res => {
        PDFJS.getDocument(res).promise.then(pdfDoc => {
          this.numPages = pdfDoc.numPages; // pdf的總頁數(shù)
          this.fileData = pdfDoc;
          this.$nextTick(() => this.renderPdf());
        });
      });
    },
    };
    this.isLoading = false;
    if (!Object.hasOwn(handle, extend)) {
    this.extendName = extend;
    return (this.extend = "other");
    }
    handle[extend]();
},

不支持的文件提示處理

在這個文件中,目前只支持docx和pdf的預(yù)覽,如果出現(xiàn)了不支持的文件,需要增加一個提示處理,告知用戶 例如如下的文件提示

<div class="container" v-show="extend == 'other'">
  <a-alert
    :message="`不支持.${this.extendName}格式的在線預(yù)覽,請下載后預(yù)覽或轉(zhuǎn)換為支持的格式`"
    description="支持docx, pdf格式的在線預(yù)覽"
    type="info"
    show-icon
  />
</div>

總結(jié)

本文只是簡單的總結(jié)了關(guān)于文件預(yù)覽的純前端實現(xiàn)和封裝方式,對于業(yè)務(wù)的思路簡單整理,如果是對于有更復(fù)雜的場景,還需要有更加具體的拆分和優(yōu)化。

到此這篇關(guān)于Vue實現(xiàn)docx、pdf格式文件在線預(yù)覽功能的文章就介紹到這了,更多相關(guān)Vue文件在線預(yù)覽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用vue + koa2 + mockjs模擬數(shù)據(jù)的方法教程

    利用vue + koa2 + mockjs模擬數(shù)據(jù)的方法教程

    這篇文章主要給大家介紹了關(guān)于利用vue + koa2 + mockjs模擬數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Vue與.net?Core?接收List<T>泛型參數(shù)

    Vue與.net?Core?接收List<T>泛型參數(shù)

    這篇文章主要介紹了Vue與.net?Core?接收List<T>泛型參數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • vue中內(nèi)嵌iframe的src更新頁面未刷新問題及解決

    vue中內(nèi)嵌iframe的src更新頁面未刷新問題及解決

    這篇文章主要介紹了vue中內(nèi)嵌iframe的src更新頁面未刷新問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • vue用h()函數(shù)創(chuàng)建Vnodes的實現(xiàn)

    vue用h()函數(shù)創(chuàng)建Vnodes的實現(xiàn)

    Vue提供了一個h()函數(shù)用于創(chuàng)建vnodes,本文就來介紹一下vue用h()函數(shù)創(chuàng)建Vnodes的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • vue實現(xiàn)視頻上傳功能

    vue實現(xiàn)視頻上傳功能

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)視頻上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • vue3如何通過動態(tài)綁定exclude在退出登錄時清除keepAlive緩存

    vue3如何通過動態(tài)綁定exclude在退出登錄時清除keepAlive緩存

    這篇文章主要介紹了vue3如何通過動態(tài)綁定exclude在退出登錄時清除keepAlive緩存問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • vue中$emit的用法詳解

    vue中$emit的用法詳解

    這篇文章主要介紹了vue中$emit的用法詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 詳解Vue中使用Axios攔截器

    詳解Vue中使用Axios攔截器

    這篇文章主要Vue使用Axios攔截器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • vue中上傳視頻或圖片或圖片和文字一起到后端的解決方法

    vue中上傳視頻或圖片或圖片和文字一起到后端的解決方法

    這篇文章主要介紹了vue中上傳視頻或圖片或圖片和文字一起到后端的解決方法,需要的朋友可以參考一下
    2019-12-12
  • vue之?dāng)?shù)據(jù)交互實例代碼

    vue之?dāng)?shù)據(jù)交互實例代碼

    本篇文章主要介紹了vue之?dāng)?shù)據(jù)交互實例代碼,vue中也存在像ajax和jsonp的數(shù)據(jù)交互,實現(xiàn)向服務(wù)器獲取數(shù)據(jù),有興趣的可以了解一下
    2017-06-06

最新評論