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本地模拟服务器请求mock数据的方法详解

    vue本地模拟服务器请求mock数据的方法详解

    这篇文章主要给大家介绍了关于vue本地模拟服务器请求mock数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • vue el-date-picker 日期回显后无法改变问题解决

    vue el-date-picker 日期回显后无法改变问题解决

    这篇文章主要介绍了vue el-date-picker 日期回显后无法改变问题解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • vue实现行列转换的一种方法

    vue实现行列转换的一种方法

    这篇文章主要介绍了vue实现行列转换的一种方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • vue如何通过某个字段获取详细信息

    vue如何通过某个字段获取详细信息

    这篇文章主要介绍了vue如何通过某个字段获取详细信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Element-UI 使用el-row 分栏布局的教程

    Element-UI 使用el-row 分栏布局的教程

    这篇文章主要介绍了Element-UI 使用el-row 分栏布局的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • vue2.0中自适应echarts图表、全屏插件screenfull的使用

    vue2.0中自适应echarts图表、全屏插件screenfull的使用

    这篇文章主要介绍了vue2.0中自适应echarts图表、全屏插件screenfull的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 在Vue项目中实现HTML转PDF功能的详细步骤

    在Vue项目中实现HTML转PDF功能的详细步骤

    在如今的项目开发过程中,将 HTML 页面转换为 PDF 格式是一种常见的需求,无论是出于保存、打印还是分享的目的,这一功能都能为我们带来诸多便利,今天,就让我们一起深入探讨如何在 Vue 项目中轻松实现 HTML 转 PDF 的功能,需要的朋友可以参考下
    2025-04-04
  • element中form组件prop嵌套属性的问题解决

    element中form组件prop嵌套属性的问题解决

    本文主要介绍了element中form组件prop嵌套属性的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue中provide、inject的使用方法案例详解

    vue中provide、inject的使用方法案例详解

    本教程是介绍如何在vue中使用provide和inject,在 Vue 中,provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式,对vue中provide、inject的使用方法感兴趣的朋友一起看看吧
    2024-02-02
  • VUE多个下拉框实现双向联动效果

    VUE多个下拉框实现双向联动效果

    这篇文章主要为大家详细介绍了VUE多个下拉框实现双向联动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论