Vue中使用pdf.js实现PDF文档展示功能实例

 更新时间:2025年04月02日 09:52:09   作者:码上前端  
最近做项目遇到在线预览和下载pdf文件,试了多种pdf插件,例如jquery.media.js(ie无法直接浏览),最后选择了pdf.js插件,这篇文章主要介绍了Vue中使用pdf.js实现PDF文档展示功能的相关资料,需要的朋友可以参考下

一、引言

在前端开发里,有时候会遇到需要在网页中展示 PDF 文档的需求。而 pdf.js 是 Mozilla 开发的一个基于 HTML5 的开源 PDF 渲染库,它能让我们在浏览器中无需借助第三方插件就可以直接展示 PDF 文件。本文会详细阐述如何在 Vue 项目里使用 pdf.js 来展示 PDF 文档。

二、pdf.js 简介

pdf.js 具备以下优点:

  • 跨平台兼容性:能在多种浏览器和设备上正常工作,为不同用户提供一致的 PDF 展示体验。
  • 无需插件:利用 HTML5 技术,直接在浏览器中渲染 PDF,无需用户安装额外的插件。
  • 开源且可定制:开源的特性使得开发者可以根据自身需求对其进行定制和扩展。

三、在 Vue 项目中集成 pdf.js

3.1 安装 pdf.js

首先要保证你已经创建了一个 Vue 项目。接着,使用 npm 或者 yarn 来安装 pdf.js:

npm install pdfjs-dist
# 或者
yarn add pdfjs-dist

3.2 创建 PDF 展示组件

在 Vue 项目里创建一个专门用于展示 PDF 的组件,下面是一个简单的示例

<template>
  <div id="pdf-container"></div>
</template>

<script setup>
import { onMounted } from 'vue';
import * as pdfjsLib from 'pdfjs-dist';
import 'pdfjs-dist/web/pdf_viewer.css';

// 设置 pdf.js 的 worker 路径
pdfjsLib.GlobalWorkerOptions.workerSrc = '//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.worker.min.js';

onMounted(async () => {
  const pdfUrl = 'your_pdf_file.pdf'; // 替换为实际的 PDF 文件路径
  const pdfContainer = document.getElementById('pdf-container');

  try {
    // 加载 PDF 文件
    const pdf = await pdfjsLib.getDocument(pdfUrl).promise;

    // 遍历每一页并渲染
    for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber++) {
      const page = await pdf.getPage(pageNumber);
      const scale = 1.5;
      const viewport = page.getViewport({ scale });

      const canvas = document.createElement('canvas');
      const context = canvas.getContext('2d');
      canvas.height = viewport.height;
      canvas.width = viewport.width;

      pdfContainer.appendChild(canvas);

      // 渲染页面到画布
      const renderContext = {
        canvasContext: context,
        viewport: viewport
      };
      await page.render(renderContext).promise;
    }
  } catch (error) {
    console.error('加载 PDF 时出错:', error);
  }
});
</script>

3.3 在主组件中使用 PDF 展示组件

在主组件里引入并使用刚刚创建的 PDF 展示组件:

<template>
  <div>
    <h1>PDF 展示</h1>
    <PdfViewer />
  </div>
</template>

<script setup>
import PdfViewer from './PdfViewer.vue';
</script>

四、代码解释

3.1 设置 worker 路径

pdfjsLib.GlobalWorkerOptions.workerSrc = '//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.worker.min.js';

pdf.js 使用 Web Worker 来处理 PDF 解析,所以要设置 worker 的路径。这里使用了 CDN 上的 worker 文件,你也可以使用本地的 worker 文件。

3.2 加载 PDF 文件

const pdf = await pdfjsLib.getDocument(pdfUrl).promise;

通过 getDocument 方法加载指定 URL 的 PDF 文件,该方法返回一个 Promise,当文件加载完成后可以获取到 PDF 对象。

3.3 渲染 PDF 页面

for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber++) {
  const page = await pdf.getPage(pageNumber);
  const scale = 1.5;
  const viewport = page.getViewport({ scale });

  const canvas = document.createElement('canvas');
  const context = canvas.getContext('2d');
  canvas.height = viewport.height;
  canvas.width = viewport.width;

  pdfContainer.appendChild(canvas);

  const renderContext = {
    canvasContext: context,
    viewport: viewport
  };
  await page.render(renderContext).promise;
}

遍历 PDF 的每一页,获取每一页的视图区域(viewport),创建一个画布(canvas),并将页面渲染到画布上。

五、优化与扩展

5.1 分页展示

可以添加分页按钮,让用户能够按需加载和查看不同的页面,而不是一次性加载所有页面,从而提升性能。

5.2 缩放功能

实现缩放功能,允许用户调整 PDF 文档的显示比例,以获得更好的阅读体验。

5.3 错误处理与提示

完善错误处理机制,当加载 PDF 文件出错时,给用户提供明确的错误提示信息。

结语

在 Vue 项目中使用 pdf.js 可以轻松实现 PDF 文档的展示功能。通过安装 pdf.js、创建展示组件并在主组件中使用,我们能够在浏览器中直接渲染 PDF 文件。同时,还可以根据需求对其进行优化和扩展,如添加分页、缩放等功能。这为前端开发中处理 PDF 文档提供了一个强大而灵活的解决方案。

到此这篇关于Vue中使用pdf.js实现PDF文档展示功能的文章就介绍到这了,更多相关Vue用pdf.js展示PDF文档内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue的底层原理你了解多少

    Vue的底层原理你了解多少

    这篇文章主要为大家详细介绍了Vue的底层原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Vue父子组件双向绑定传值的实现方法

    Vue父子组件双向绑定传值的实现方法

    父子组件之间的双向绑定非常简单,但是很多人因为是从Vue 2+开始使用的,可能不知道如何双向绑定,接下来通过本文给大家介绍Vue父子组件双向绑定传值的实现方法,需要的朋友可以参考下
    2018-07-07
  • vue左右滑动选择日期组件封装的方法

    vue左右滑动选择日期组件封装的方法

    这篇文章主要为大家详细介绍了vue左右滑动选择日期组件封装的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 对Vue.js之事件的绑定(v-on: 或者 @ )详解

    对Vue.js之事件的绑定(v-on: 或者 @ )详解

    今天小编就为大家分享一篇对Vue.js之事件的绑定(v-on: 或者 @ )详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue监听页面滚动到某个高度触发事件流程

    vue监听页面滚动到某个高度触发事件流程

    这篇文章主要介绍了vue监听页面滚动到某个高度触发事件流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue this.$refs.xxx报错undefined问题及解决

    vue this.$refs.xxx报错undefined问题及解决

    这篇文章主要介绍了vue this.$refs.xxx报错undefined问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue的表单数据收集案例之基本指令和自定义指令详解

    vue的表单数据收集案例之基本指令和自定义指令详解

    收集表单数据可以使用这个v-model实现这个数据的绑定,但是在有些输入框中,还需要一些其他的指令搭配这个v-model指令结合使用,这篇文章主要介绍了vue的表单数据收集,基本指令和自定义指令,需要的朋友可以参考下
    2023-01-01
  • Vue.js自定义指令学习使用详解

    Vue.js自定义指令学习使用详解

    这篇文章主要为大家详细介绍了Vue.js自定义指令的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件

    浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件

    本篇文章主要介绍了vue自定义全局组件并通过全局方法 Vue.use() 使用该组件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • vue3如何实现变量双向绑定

    vue3如何实现变量双向绑定

    这篇文章主要介绍了vue3如何实现变量双向绑定问题,具有很好的参考价值,希望对大家有所帮助,
    2023-11-11

最新评论