vue查看pdf文件的组件封装

583 阅读1分钟

本文主要是系统中需要查看pdf文件的地方较多,将此功能封装成一个独立的组件来使用,使用插件pdfjs-dist。

1、引入组件: import ViewBase64Pdf from '@/components/ViewBase64Pdf'

2、注册组件:components: { ViewBase64Pdf }

3、使用组件: <ViewBase64Pdf v-if="base64pdfStr" :base64-str="base64pdfStr" :scale="1.2" />

<template>

  <div class="view-pdf-container">

    <canvas v-for="item in pageNum" :ref="'pdf' + item" :key="item + 'view'" class="view-pdf" :title="item" />

  </div>

</template>

\


<script>

import PDFJS from 'pdfjs-dist'

PDFJS.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.js'

export default {

  name'',

  props: {

    // base64pdf字符串

    base64Str: {

      typeString,

      default''

\


    },

    // 缩放倍数

    scale: {

      typeNumber,

      default1.7

    },

    // 模式

    mode: {

      typeString,

      default'scroll' // scroll flip

    }

  },

  data() {

    return {

      pageNum1 // pdf总页数

    }

  },

  watch: {

    base64Str: {

      immediatetrue,

      handlerfunction(newVal, oldVal) {

        if (newVal) this.showPdf()

      }

    }

  },

  methods: {

    // 查看pdf影像

    async showPdf() {

      const data = this.base64Str

      const decodedBase64 = atob(data.replace(/[\r\n]/g'')) // 使用浏览器自带的方法解码(先去掉字符串中的换行和回车防止IE环境报错)

      const pdf = await PDFJS.getDocument({ data: decodedBase64 }) // 返回一个pdf对象

      const scale = this.scale // 缩放倍数,1表示原始大小

      this.pageNum = pdf.numPages // 声明一个pages变量等于当前pdf文件的页数

      for (let item = 1; item < this.pageNum + 1; item++) {

        const canvas = this.$refs['pdf' + item][0]

        const page = await pdf.getPage(item) // 调用getPage方法传入当前循环的页数,返回一个page对象

        const viewport = page.getViewport(scale)

        const context = canvas.getContext('2d'// 创建绘制canvas的对象

        canvas.height = viewport.height // 定义canvas高和宽

        canvas.width = viewport.width

        const renderContext = {

          canvasContext: context,

          viewport: viewport

        }

        await page.render(renderContext)

      }

    }

  }

}

</script>

<style lang="scss" scoped>

.view-pdf-container {

  width100%;

  .view-pdf {

      margin-left50%;

      transformtranslate(-50%,0);

  }

}

</style>

\