pdfjs-dist 实现pdf文件在线预览

本文介绍了如何使用pdfjs-dist库在前端实现PDF文件的在线预览,包括安装指定版本的pdfjs-dist,将PDF文件转化为base64数据,以及利用canvas展示PDF页面,并实现翻页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


项目要求实现pdf文件在线预览,并且pdf预览通过上下页滚动pdf,且兼容ie浏览器
浏览器兼容参照了 这位博主的文章,选择用pdfjs-dist 实现

实现效果

这是我随便写的一个pdf(一共2页),可通过点击上下换页
谷歌浏览器
在这里插入图片描述

ie11
在这里插入图片描述

实现过程

(1)安装pdfjs-dist

npm install --save pdfjs-dist@2.0.943

这里需要指定2.0.943的版本,试过其他版本的都会多多少少在引入,执行行数时报错

(2)代码部分


<template>
  <div class="main-container">
    <input type="file" ref="fielinput" @change="uploadFile" />
    <div class="canvas-container">
      <canvas ref="myCanvas" class="pdf-container"> </canvas>
    </div>
    <div class="pagination-wrapper">
      <button @click="clickPre">上一页</button>
      <span>{
   {
    pageNo }} / {
   {
    pdfPageNumber }}</span>
      <button @click="clickNext">下一页</button>
    </div>
  </div>
</template>

<script>
const pdfJS = require("pdfjs-dist");

pdfJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/build/pdf.worker.entry");
export default {
   
  mounted() {
   },
  data() {
   
    return {
   
      pageNo: 
### 使用 `pdfjs-dist` 库在 Vue 项目中实现 PDF 文件预览 #### 安装依赖包 为了能够在 Vue 项目中使用 `pdfjs-dist` 来加载并渲染 PDF 文档,首先需要安装必要的 npm 包: ```bash npm install pdfjs-dist --save ``` 此命令会下载 `pdfjs-dist` 及其所需的相关资源到项目的 node_modules 目录下[^1]。 #### 导入 PDF.js 并配置全局变量 接着,在 main.js 或者相应的入口文件里引入 PDF.js 的核心模块,并设置全局路径以便于后续操作: ```javascript import * as pdfjsLib from 'pdfjs-dist'; // 如果需要 Web Worker 支持,则还需要额外导入 worker 文件 import 'pdfjs-dist/build/pdf.worker.entry'; // 设置 PDFJS 工具的默认参数 pdfjsLib.GlobalWorkerOptions.workerSrc = new URL( 'pdfjs-dist/build/pdf.worker.min.js', import.meta.url, ).toString(); ``` 这段代码确保了当解析较大的 PDF 文件时可以利用多线程加速性能[^3]。 #### 创建组件用于显示 PDF 页面 创建一个新的单文件组件 (SFC),比如命名为 PdfViewer.vue ,用来负责呈现具体的 PDF 内容。在这个组件内部定义方法去获取远程或本地存储的 PDF 数据源,并逐页绘制出来: ```html <template> <div class="pdf-viewer"> <!-- 动态生成 canvas 标签 --> <canvas v-for="(page, index) in pages" :key="index"></canvas> </div> </template> <script setup lang="ts"> import { ref } from "vue"; import * as pdfjsLib from "pdfjs-dist"; const props = defineProps({ url: String // 接收外部传递过来的 PDF 路径作为 prop 属性 }); let loadingTask; let numPages = ref(0); let pages = []; async function loadPdf() { try { const response = await fetch(props.url); const arrayBuffer = await response.arrayBuffer(); // 加载 PDF 文档对象 loadingTask = pdfjsLib.getDocument(arrayBuffer); const pdfDocument = await loadingTask.promise; numPages.value = pdfDocument.numPages; for (let pageNumber = 1; pageNumber <= numPages.value; ++pageNumber) { renderPage(pdfDocument, pageNumber); } } catch (error) { console.error("Error while loading the document:", error); } } function renderPage(doc, pageNum) { doc.getPage(pageNum).then((page) => { let viewport = page.getViewport({ scale: 1.5 }); // 准备画布容器 var canvas = document.createElement('CANVAS'); var context = canvas.getContext('2d'); // 配置 Canvas 尺寸匹配页面大小 canvas.height = viewport.height; canvas.width = viewport.width; // 插入新创建好的 Canvas 到 DOM 结构内 document.querySelector('.pdf-viewer').appendChild(canvas); // 渲染当前页面至指定上下文中 var renderContext = { canvasContext: context, viewport: viewport }; page.render(renderContext); }); } </script> <style scoped> .pdf-viewer { display: flex; flex-direction: column; align-items: center; } </style> ``` 上述模板展示了如何构建一个简单的 PDF 查看器,它能够接收来自父级组件或者其他地方传来的 PDF 文件链接,并将其内容一页接一页地呈现在界面上。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值