vue3本地预览pdf

准备:

  1. 下载pdfjs-dist
  2. 在vue项目public文件下创建pdfjs-dist目录
  3. 将下载的文件放入目录中(如下图所示)

2d6027ec1523405db57f3b0b1aca77f5.jpeg

 第一步

在index.html中引入pdfjs

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + Vue</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- 引入pdfjs -->
    <script src="/pdfjs-dist/pdf.min.js"></script>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

第二步

先要引入全局变量和配置

// 'pdfjs-dist/build/pdf' 是pdfjs挂在到window下的全局变量名称
const pdfjsLib = window['pdfjs-dist/build/pdf']
pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs-dist/pdf.worker.min.js'

加载

这是一个loader方法

// 异步加载需要渲染的pdf文件
// props.src = 需要加载的文件地址
const loader = async () => {
  pdfCtx = await pdfjsLib.getDocument(props.src).promise
  pageNumber.value = pdfCtx.numPages
  /**
    nextTick(async () => {
      const renders = []
      for (let index = 1; index <= pdfCtx.numPages; index++) {
        renders.push(render(index))
      }
      await Promise.all(renders)
      // 渲染完成
    })
  */
}

渲染

这是render函数

// number表示第几页
const render = async (number) => {
  const page = await pdfCtx.getPage(number)
  // 这里的一个canvas渲染pdf其中的一页
  const canvas = document.getElementById(`pdf-canvas-${number}`)
  const ctx = canvas.getContext('2d')
  const viewport = page.getViewport({ scale: props.scale })
  canvas.height = viewport.height
  canvas.width = viewport.width
  page.render({
    canvasContext: ctx,
    viewport
  })
  return true
}

完整代码(Vue3)

<script setup>
import { ref, onMounted, nextTick } from 'vue'
const pdfjsLib = window['pdfjs-dist/build/pdf']
pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs-dist/pdf.worker.min.js'

const props = defineProps({
  src: String,
  scale: {
    type: Number,
    default: 1
  }
})
// 注意不能使用响应式
let pdfCtx = null
const pageNumber = ref(0)
const loading = ref(false)

onMounted(() => {
  if (props.src) {
    loader()
  }
})

const loader = async () => {
  pdfCtx = await pdfjsLib.getDocument(props.src).promise
  pageNumber.value = pdfCtx.numPages
  nextTick(async () => {
    const renders = []
    for (let index = 1; index <= pdfCtx.numPages; index++) {
      renders.push(render(index))
    }
    loading.value = true
    await Promise.all(renders)
    loading.value = false
  })
}
const render = async (number) => {
  const page = await pdfCtx.getPage(number)
  const canvas = document.getElementById(`pdf-canvas-${number}`)
  const ctx = canvas.getContext('2d')
  const viewport = page.getViewport({ scale: props.scale })
  canvas.height = viewport.height
  canvas.width = viewport.width
  page.render({
    canvasContext: ctx,
    viewport
  })
  return true
}

</script>
<template>
  <div class="pdf">
    <template  v-for="number in pageNumber" :key="number">
      <canvas :id="`pdf-canvas-${number}`"></canvas>
    </template>
  </div>
</template>
<style lang="less" scoped>
.pdf{
  canvas{
    width: 100%;
  }
}
</style>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹小维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值