基于最新 pdf.js 在 Vue3 中预览pdf的方法

方法一:将pdf文件渲染成Canvas
1、安装pdfjs-dist

"pdfjs-dist": "^3.5.141"

2、代码

<template>
  <div id="pdf-container">
    <canvas v-for="page in state.pdfPages" :key="page" :id="`pdfCanvas${page}`" style="border-bottom:1px solid #d4d2d2" />
  </div>
</template>
<script setup>
import { reactive, nextTick, onMounted } from 'vue'
import * as PDF from 'pdfjs-dist'
const pdfjsWorker = import('pdfjs-dist/build/pdf.worker.entry')
PDF.GlobalWorkerOptions.workerSrc = pdfjsWorker

// 在public目录下的2.pdf
import pdf from '/2.pdf'

const state = reactive({
  pdfPath: pdf, // 本地PDF文件路径放在/public中
  pdfPages: '', // 页数
  pdfWidth: '', // 宽度
  pdfSrc: '', // 地址
  pdfScale: 1.0, // 放大倍数
})

let pdfDoc = null

onMounted(() => {
  loadFile(state.pdfPath)
})
function loadFile (url) {
  PDF.getDocument(url).promise.then((p) => {
    pdfDoc = p
    const { numPages } = p
    state.pdfPages = numPages
    nextTick(() => {
      renderPage(1) // 从第一页开始渲染
    })
  })
}
function renderPage (num) {
  pdfDoc.getPage(num).then((page) => {
    const canvas = document.getElementById(`pdfCanvas${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: state.pdfScale })
    canvas.width = viewport.width * ratio
    canvas.height = viewport.height * ratio
    canvas.style.width = '100%'
    canvas.style.height = '100%'
    state.pdfWidth = `${viewport.width}px`
    ctx.setTransform(ratio, 0, 0, ratio, 0, 0)
    // 将 PDF 页面渲染到 canvas 上下文中
    const renderContext = {
      canvasContext: ctx,
      viewport,
    }
    page.render(renderContext)
    if (state.pdfPages > num)
      renderPage(num + 1)
  })
}

</script>
<style>
#videoContainer {
  height: 842px;
}
</style>

3、效果
在这里插入图片描述

方法二:使用viewer.html
1、下载 pdf.js
下载地址
在这里插入图片描述
2、将包放到public中
在这里插入图片描述
3、代码

<template>
  <div class="container">
    <iframe :src="pdfUrl" width="100%" height="100%"></iframe>
  </div>
</template>

<script setup>
import { onMounted, ref } from 'vue';

const props = defineProps({
  fileUrl: {
    type: String,
    default: '/2.pdf'
  }
})
const pdfUrl = ref(''); // pdf文件地址
// pdfjs包的路径
const fileUrl = '/pdfjs/web/viewer.html?file='; // pdfjs文件地址

onMounted(() => {
  pdfUrl.value = fileUrl + encodeURIComponent(props.fileUrl);
});
</script>

<style scoped lang="scss">
.container {
  width: 100%;
  height: 100%;
}
</style>

4、效果
在这里插入图片描述

说明:方法一的展示效果比方法二的展示效果模糊

参考
【PDF.js】2023 最新 PDF.js 在 Vue3 中的使用
vue3项目使用pdf.js插件实现:搜索高亮、修改pdf.js显示的页码、向pdf.js传值、控制搜索、处理接口文件流
超详细的vue3使用pdfjs教程

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

k0933

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

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

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

打赏作者

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

抵扣说明:

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

余额充值