返回博客

Vue PDF 渲染、签名与批注库:InkLayer 完整指南

~4 分钟阅读
InkLayer
Vue PDF 渲染、签名与批注库:InkLayer 完整指南

如果你正在寻找一个支持 PDF 渲染、签名和批注的 Vue 3 类库,InkLayer 提供了可以直接安装的 PdfViewerPdfAnnotator 组件。它基于 PDF.js,支持高亮、评论、自由手绘、手写或图片签名、印章、批注持久化以及 PDF 导出。

npm install inklayer-vue
你的需求InkLayer 对应能力
在 Vue 中渲染 PDFPdfViewer,内置缩放、搜索、打印与页面导航
添加高亮、评论和图形PdfAnnotator,提供完整批注工具栏与 14 种批注类型
在 PDF 上签名手绘签名、输入签名或上传签名图片
保存和恢复批注通过 JSON 数据接入后端或本地存储
交付审阅结果导出带批注的 PDF 或 Excel 审阅记录

你可以先在线体验 PDF 批注,或直接查看Vue SDK 文档

签名能力边界: InkLayer 的签名属于可视化 PDF 批注,适合手写、输入或上传签名图片;它不等同于使用数字证书的 PAdES/PKCS#7 密码学签名。如果业务要求证书验证、可信时间戳或合规签署流程,需要另外接入数字签名服务。


为什么 PDF.js 还不等于 Vue PDF 批注器

PDF.js 解决的是 PDF 解析和页面渲染。直接在 Vue 项目里使用它,你仍然需要自行完成:

  • 缩放、翻页、搜索和缩略图界面;
  • 高亮选区与 PDF 坐标转换;
  • 手绘、签名、印章和形状工具;
  • 批注选中、拖拽、缩放与删除;
  • 评论回复、用户归属和权限;
  • JSON 保存、恢复以及 PDF 导出。

InkLayer 在 PDF.js 渲染能力之上提供 Vue 组件、批注数据模型和交互层,让业务代码可以围绕 Props、事件和插槽展开。

第一步:注册 Vue 插件

Vue 版本需要在应用入口注册插件:

import { createApp } from 'vue'
import { inklayerVuePlugin } from 'inklayer-vue'
import App from './App.vue'

const app = createApp(App)
app.use(inklayerVuePlugin)
app.mount('#app')

然后在组件中导入样式:

<script setup lang="ts">
import { PdfAnnotator } from 'inklayer-vue'
import 'inklayer-vue/style'
</script>

第二步:渲染一个可批注的 PDF

最小示例只需要 PDF 地址、当前用户和容器高度:

<script setup lang="ts">
import { PdfAnnotator } from 'inklayer-vue'
import 'inklayer-vue/style'
</script>

<template>
  <PdfAnnotator
    url="https://inklayer.dev/inklayer-demo.pdf"
    locale="zh-CN"
    :user="{ id: 'reviewer-1', name: '张三' }"
    :layout-style="{ width: '100%', height: '100vh' }"
  />
</template>

PdfAnnotator 已经包含 PDF Viewer、批注工具栏和批注侧栏。只需要阅读 PDF、不允许编辑批注时,可以改用 PdfViewer

高亮、评论和批注事件

Vue 使用模板事件接收批注变化:

<script setup lang="ts">
import type { Annotation } from 'inklayer-vue'

function handleAdded(annotation: Annotation) {
  console.log('新增批注:', annotation.id, annotation.kind)
}

function handleUpdated(annotation: Annotation) {
  console.log('批注或评论已更新:', annotation.id)
}
</script>

<template>
  <PdfAnnotator
    url="/contract.pdf"
    :user="{ id: 'reviewer-1', name: '张三' }"
    @annotation-added="handleAdded"
    @annotation-updated="handleUpdated"
    @annotation-deleted="(id) => console.log('删除:', id)"
    @annotation-selected="(annotation, isClick) => console.log(annotation?.id, isClick)"
  />
</template>

高亮、下划线和删除线会保存文字选区的四边形坐标;自由手绘会保存路径点;评论和回复会与对应批注一起保存。缩放页面时,批注仍然使用 PDF 用户空间保持对齐。

手绘、输入和图片签名

签名工具支持三种入口:DrawEnterUpload。可以通过 defaultOptions.signature 设置默认模式、允许的图片格式和字体:

<script setup lang="ts">
const defaultOptions = {
  signature: {
    type: 'Draw' as const,
    accept: 'image/png,image/jpeg',
    maxSize: 2 * 1024 * 1024,
    defaultSignature: [],
    defaultFont: [
      { label: '楷体', value: 'STKaiti', external: false },
    ],
  },
}
</script>

<template>
  <PdfAnnotator
    url="/contract.pdf"
    :user="{ id: 'signer-1', name: '签署人' }"
    :default-options="defaultOptions"
  />
</template>

signature.type 必须使用首字母大写的 'Draw' | 'Enter' | 'Upload'

保存和恢复批注

@save 会返回完整的 Annotation[]。应用可以将它作为 JSON 保存到后端:

<script setup lang="ts">
import { ref } from 'vue'
import type { Annotation } from 'inklayer-vue'

const annotations = ref<Annotation[]>([])

async function handleSave(data: Annotation[]) {
  annotations.value = data
  await fetch('/api/documents/contract-1/annotations', {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data),
  })
}
</script>

<template>
  <PdfAnnotator
    url="/contract.pdf"
    :user="{ id: 'reviewer-1', name: '张三' }"
    :initial-annotations="annotations"
    @save="handleSave"
  />
</template>

恢复时应保留批注 ID、几何坐标和作者信息。启用 owner-only 权限后,作者 ID 还会用于判断谁能编辑或删除批注。

导出 PDF 和审阅记录

通过 actions 插槽可以把保存和导出操作接入自己的工具栏:

<template>
  <PdfAnnotator url="/contract.pdf" :user="{ id: 'reviewer-1', name: '张三' }">
    <template #actions="{ onSave, exportToPdf, exportToExcel }">
      <button @click="onSave()">保存</button>
      <button @click="exportToPdf('合同审阅版')">导出 PDF</button>
      <button @click="exportToExcel('审阅记录')">导出 Excel</button>
    </template>
  </PdfAnnotator>
</template>
  • PDF 导出适合交付包含可见批注的文档;
  • Excel 导出适合整理批注作者、内容和处理状态;
  • 应用自己的 JSON 数据仍然是继续编辑和协作的主要来源。

Vue PDF 批注方案怎么选

方案适合场景主要成本
直接使用 PDF.js需要完全控制底层渲染自行实现全部批注 UI、坐标和数据层
只使用高亮组件需求仅限文字高亮和简单评论后续增加签名、形状和导出时需要扩展
使用 InkLayer需要查看、批注、签名、评论、保存和导出接入 Vue 插件,并连接自己的数据与权限系统
商业 PDF SDK需要厂商支持或特定合规能力授权成本和供应商约束

常见问题

InkLayer Vue 支持哪些批注?

包括高亮、下划线、删除线、自由文本、矩形、圆形、自由手绘、自由高亮、签名、印章、便签、箭头、云朵和选区等 14 种类型。

批注是否会随缩放错位?

批注几何数据使用 PDF 用户空间保存,并在渲染时映射到当前视口,因此可以在不同缩放比例下保持对齐。

可以限制用户只能编辑自己的批注吗?

可以。通过 annotationPermissionsowner-only 模式结合稳定的 user.id 实现。完整规则见协作批注权限

签名是否具有数字证书效力?

InkLayer 负责签名的可视化放置和 PDF 批注数据,不签发或验证数字证书。需要 PAdES、可信时间戳或身份认证时,应在业务系统中接入对应服务。

下一步

准备好构建 PDF 批注功能了吗?

InkLayer 为 React 和 Vue 提供完整的 PDF 查看与批注组件,支持 14 种批注类型、精确渲染、保存与导出。