面向业务系统提供高保真 PDF 渲染、分页控制、缩放旋转、水印防泄露、主题切换与私有化接入能力。
保持前端集成足够轻,业务扩展足够深,适合需要稳定嵌入式 PDF 能力的产品团队。
很多业务系统并不需要一个“大而全”的文档平台,而是需要一个足够稳定、足够专业、能在页面里快速落地的 PDF 预览能力。 JitPDF 就是把最常用、最关键的 PDF 能力抽成一个可嵌入、可控制、可定制的 SDK。
JitPDF 面向的是已经有业务页面、已有权限模型、已有对象存储和接口体系的团队。你不需要更换现有系统,只要把 PDF 预览能力以组件的方式嵌进去。
SDK 提供统一的挂载方式、文件源接入方式以及一组稳定的控制 API,适合在合同、审批、公文、知识、档案、财务等高频 PDF 场景中复用。
如果你还需要进一步做签章前预览、水印叠加、鉴权请求、暗色主题或私有化部署,JitPDF 也可以沿着这条路径继续扩展。
围绕 PDF 业务接入的核心需求做减法和增强
保持一个清晰的初始化入口,支持组件化挂载到任何页面区域,不挤占现有业务架构。
内置分页、跳页、缩放、旋转、下载、全屏等高频操作,适合合同、公文、报告等多页文档场景。
暴露稳定实例方法与状态获取接口,方便你把 PDF 预览能力融入自己的工具条、业务按钮和流程动作里。
支持文本或图片水印覆盖,不改原始文件内容,可配合权限、代理与签名 URL 形成更完整的安全链路。
桌面端与移动端都可稳定运行,适合门户、审批移动页、H5 嵌入页等多种展示形态。
既支持对象存储 URL,也支持本地上传文件、Blob、ArrayBuffer 和带请求头的受控文件地址。
在 Vue3、React 和原生 HTML 中保持相似的使用方式,降低团队在多端项目中的重复适配成本。
支持浅色与深色主题切换,也便于嵌入你的设计系统,保持整站视觉风格一致。
适合和你现有权限、日志、审计、上传、存储、签章、流程等能力组合,支持进一步做私有化方案。
不仅能看 PDF,还要能融入你现有业务流程
可以直接传 URL,也可以从你的上传组件、本地缓存、接口请求结果里拿到 File、Blob 或 ArrayBuffer。
通过统一配置设置主题、工具栏、初始页码、缩放比例、水印、请求适配器和错误回调。
你可以把它放进详情页、审批弹窗、Tab 页、抽屉或全屏工作台中,不要求单独跳转新页面。
借助实例方法控制翻页、缩放、下载与主题,把 PDF 预览能力与你自己的审批、签署、标记、审计流程衔接起来。
| 能力项 | 说明 |
|---|---|
| 文件接入 | URL、File、Blob、ArrayBuffer、带 Headers 的受控资源 |
| 页面控制 | 上一页、下一页、跳转指定页、获取当前页信息 |
| 视图控制 | 缩放、旋转、重置、全屏、主题切换 |
| 安全增强 | 文本/图片水印、代理地址、自定义请求适配器 |
| 接入方式 | npm 包、CDN 引入、组件封装、自定义容器挂载 |
| 部署形态 | 云端使用、内网部署、与现有存储或网关体系集成 |
如果你的团队已经有前端页面能力,但不想自己从零处理 PDF 预览、分页、缩放、水印和兼容性问题,JitPDF 会更像一个稳定的“PDF 能力模块”。
按仓库 README 的真实接入方式,体验 JitPdfEditor 的挂载式集成流程
这个 demo 按照仓库 `examples/html-demo/index.html` 的思路实现:先通过 `uploadFile()` 导入本地工作区,再使用 `mountJitPdfEditor()` 挂载编辑器。
当前示例基于仓库 README 中推荐的纯本地模式:`createIndexedDbPdfEditorService()` + `mountJitPdfEditor()`,适合无后端接入的 POC、静态 HTML 页面与传统系统嵌入场景。
支持 npm 安装与 CDN 引入,面向现代前端项目快速落地
# npm
npm install jit-pdf vue
# yarn
yarn add jit-pdf vue
# pnpm
pnpm add jit-pdf vue
<template>
<div style="height: 100vh">
<input type="file" accept=".pdf,application/pdf" @change="onFileChange" />
<JitPdfEditor
v-if="source"
:source="source"
:service="service"
locale="zh-CN"
theme="blue-enterprise"
/>
</div>
</template>
<script setup>
import { ref } from "vue"
import "jit-pdf/styles.css"
import {
JitPdfEditor,
createIndexedDbPdfEditorService,
type PdfSource
} from "jit-pdf"
const service = createIndexedDbPdfEditorService({
databaseName: "my-jit-pdf"
})
const source = ref<PdfSource | null>(null)
async function onFileChange(event) {
const input = event.target
const file = input.files?.[0]
if (!file) return
const uploaded = await service.uploadFile(file)
source.value = {
type: "local",
fileId: uploaded.id,
name: uploaded.name
}
}
</script>
import { useEffect, useRef } from 'react'
import 'jit-pdf/styles.css'
import {
createIndexedDbPdfEditorService,
mountJitPdfEditor
} from 'jit-pdf/browser'
const service = createIndexedDbPdfEditorService({
databaseName: 'jit-pdf-react-demo'
})
export function PdfPanel({ fileId, fileName }) {
const containerRef = useRef(null)
useEffect(() => {
if (!containerRef.current) return
const mounted = mountJitPdfEditor({
target: containerRef.current,
source: {
type: 'local',
fileId,
name: fileName
},
service,
locale: 'zh-CN',
theme: 'blue-enterprise'
})
return () => mounted.unmount()
}, [fileId, fileName])
return <div ref={containerRef} style={{ height: '100vh' }} />
}
按仓库 README 中的真实对外 API,整理成更适合接入评估的速查页
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
source |
PdfSource | - | 文档来源,支持 local、remote、url |
service |
PdfEditorService | - | 文件与批注的服务抽象,通常由 createIndexedDbPdfEditorService() 或 createHttpPdfEditorService() 生成 |
theme |
'blue-enterprise' | 'blue-enterprise' | 企业蓝色主题,仓库示例默认使用该主题 |
locale |
'zh-CN' | 'zh-CN' | 当前 README 中公开的示例语言配置 |
capabilities |
Partial<PdfEditorCapabilities> | - | 能力开关配置,可按业务场景裁剪编辑器能力 |
readonly |
boolean | false | 是否只读,可用于仅查看、不可编辑的业务页面 |
target |
HTMLElement | string | - | 仅在 mountJitPdfEditor() 模式下需要,用于指定挂载容器 |
onReady |
function | - | 文档就绪回调,可读取 documentId |
onSaveSuccess |
function | - | 保存副本成功回调,可读取 relativePath |
onLoadError |
function | - | 加载失败回调,可读取错误信息 |
按仓库中的 Vue demo、HTML demo 和 README 示例整理
适合本地调研、组件演示、无后端的 POC 场景
import { ref } from "vue"
import "jit-pdf/styles.css"
import {
JitPdfEditor,
createIndexedDbPdfEditorService,
type PdfSource
} from "jit-pdf"
const service = createIndexedDbPdfEditorService({
databaseName: "jit-pdf-vue-demo"
})
const source = ref<PdfSource | null>(null)
const uploaded = await service.uploadFile(file)
source.value = {
type: "local",
fileId: uploaded.id,
name: uploaded.name
}
适合生产环境、流式预览、历史副本和本地文件服务接入
import { createHttpPdfEditorService } from "jit-pdf"
const service = createHttpPdfEditorService({
baseUrl: "http://localhost:4000",
annotationDatabaseName: "jit-pdf-annotations"
})
<JitPdfEditor
:source="{ type: 'remote', fileId: 'your-file-id' }"
:service="service"
locale="zh-CN"
theme="blue-enterprise"
/>
适合静态页、传统模板引擎和低耦合集成场景
const { createIndexedDbPdfEditorService, mountJitPdfEditor } = window.JitPdfSdk
const service = createIndexedDbPdfEditorService({
databaseName: "jit-pdf-html-demo"
})
const uploaded = await service.uploadFile(file)
mountJitPdfEditor({
target: "#app",
source: {
type: "local",
fileId: uploaded.id,
name: uploaded.name
},
service,
locale: "zh-CN",
theme: "blue-enterprise"
})
适合保存副本、加载错误提示、审计日志和流程状态联动
mountJitPdfEditor({
target: "#app",
source,
service,
onReady(event) {
console.log("文档已就绪", event.documentId)
},
onSaveSuccess(result) {
console.log("副本保存成功", result.relativePath)
},
onLoadError(error) {
console.error("加载失败", error.message)
}
})
如果你正在做 PDF 在线预览、合同审批、公文查看、知识文档展示等项目,欢迎联系我们一起评估接入方式