vue-pdf-embed(Vue3实现pdf本地预览功能)

适用于 Vue 3 的 PDF 嵌入组件(Vue 2 支持请参见兼容性部分)

特性

  • 在 Vue 应用中可控渲染 PDF 文档

  • 处理受密码保护的文档

  • 包含文本层(可搜索和选择文档内容)

  • 包含注释层(注释和链接)

  • 无需 peer 依赖或额外配置

  • 可直接在浏览器中使用(参见示例)

兼容性

此包仅兼容 Vue 3。如需 Vue 2 支持,请安装 vue-pdf-embed@1 并参考 v1 文档。

安装

根据环境,可通过以下方式之一安装此包:

bash 复制代码
npm install vue-pdf-embed

// 或

yarn add vue-pdf-embed
html 复制代码
<script src="https://unpkg.com/vue-pdf-embed"></script>

使用方法

javascript 复制代码
<script setup>
import VuePdfEmbed from 'vue-pdf-embed'

// 可选样式
import 'vue-pdf-embed/dist/styles/annotationLayer.css'
import 'vue-pdf-embed/dist/styles/textLayer.css'

// 可以是 URL、Base64、二进制数据或文档代理对象
const pdfSource = '<PDF_URL>'
</script>

<template>
  <VuePdfEmbed annotation-layer text-layer :source="pdfSource" />
</template>

属性

名称 类型 可接受值 描述
annotationLayer boolean 是否启用注释层
height number 自然数 期望的页面高度(像素)(如果指定了 width 属性则忽略此值)
imageResourcesPath string URL 或带有尾部斜杠的路径 注释层中使用的图标路径
linkService PDFLinkService 用于覆盖默认文档导航服务的服务(触发 internal-link-clicked 事件)
page number number[] 1 到最后一页的页码 要显示的页码(如未指定则显示所有页面)
rotation number 0, 90, 180, 270(90 的倍数) 期望的页面旋转角度(度)
scale number 有理数 期望的页面视口缩放比例
source string object PDFDocumentProxy 文档 URL、Base64、类型化数组或文档代理对象 要显示的文档来源
textLayer boolean 是否启用文本层
width number 自然数 期望的页面宽度(像素)

事件

名称 值 描述
internal-link-clicked 目标页码 内部链接被点击
loaded PDF 文档代理对象 文档加载完成
loading-failed 错误对象 文档加载失败
password-requested 包含 callback 函数和 isWrongPassword 标志的对象 需要密码才能显示文档
progress 包含已加载页数 loaded 和总页数 total 的对象 跟踪文档加载进度
rendered -- 文档渲染完成
rendering-failed 错误对象 文档渲染失败

插槽

名称 属性 描述
after-page page(页码) 每页后添加的内容
before-page page(页码) 每页前添加的内容

公共方法

名称 参数 描述
download 文件名 (string) 下载文档
print 打印分辨率 (number), 文件名 (string), 所有页面标志 (boolean) 通过浏览器接口打印文档

注意: 公共方法可通过模板引用访问。

常见问题与注意事项

服务器端渲染

这是一个客户端库,因此在处理 SSR(服务器端渲染)框架(如 Nuxt)时需要牢记这一点。根据使用的框架,您可能需要正确配置库导入或使用包装器。

Web Worker 加载

默认加载用于处理 PDF 文档的 web worker。但是,由于打包器限制或 CSP(内容安全策略),这可能无法接受。在这种情况下,建议使用基本构建(index.essential.mjs)并使用暴露的 GlobalWorkerOptions 手动设置 worker。

javascript 复制代码
import { GlobalWorkerOptions } from 'vue-pdf-embed/dist/index.essential.mjs'
import PdfWorker from 'pdfjs-dist/build/pdf.worker.mjs?url'

GlobalWorkerOptions.workerSrc = PdfWorker

文档加载

通常,文档加载在组件内部处理。但是,出于优化目的,可以在 useVuePdfEmbed 组合函数中加载文档,然后将其作为组件的 source 属性传递(例如,在多个组件实例之间共享源时)。

javascript 复制代码
<script setup>
import VuePdfEmbed, { useVuePdfEmbed } from 'vue-pdf-embed'

const { doc } = useVuePdfEmbed({ source: '<PDF_URL>' })
</script>

<template>
  <VuePdfEmbed :source="doc" />
</template>

资源

应指定预定义 CMaps 的路径,以确保正确渲染包含非拉丁字符的文档,以及在发生 CMap 相关错误时:

javascript 复制代码
<VuePdfEmbed
  :source="{
    cMapUrl: 'https://unpkg.com/pdfjs-dist/cmaps/',
    url: '<PDF_URL>',
  }"
/>

必须指定图像资源路径才能使注释正确显示:

javascript 复制代码
<VuePdfEmbed
  image-resources-path="https://unpkg.com/pdfjs-dist/web/images/"
  source="<PDF_URL>"
/>

注意: 上面的示例使用 CDN 加载资源,但是这些资源也可以通过安装 pdfjs-dist 包作为依赖项并进一步配置打包器来包含在构建中。

相关推荐
梦醒沉醉6 分钟前
8、正则表达式
javascript
ComPDFKit1 小时前
PDF 涂黑后还能复制?用 ComPDF 检查敏感文字是否真正删除
pdf
sun_weitao1 小时前
Chrome 扩展插件开发指南
前端·javascript·chrome
labview_自动化2 小时前
cvat部署记录
javascript·labview
飞塔老梅子2 小时前
21. 按页数或章节分割大PDF文件 ❀ 老梅子学AI
pdf·分割·basic·pdfsam·裁切
BD_Marathon2 小时前
ChatPromptTemplate的高级特性
android·java·javascript
用户6259411859492 小时前
vibe coding怎么入门:从自然语言到可运行代码的完整指南
javascript
℘团子এ2 小时前
vue3中自定义指令的使用
前端·javascript·vue.js
Ai-_Man2 小时前
DeepSeek生成的内容能否下载吗?
开发语言·javascript·人工智能·小程序·ecmascript
兰亭妙微UI设计公司2 小时前
兰亭妙微分享:高手设计登录页的12种切入点
开发语言·前端·javascript