更新记录
1.4.2(2026-09-06)
- 归并 uni-app x Android 示例修复:调用方显式构造公开 Options 类型,结果和错误回调按真实类型读取,避免示例运行时对象转换异常;版本号保持
1.4.2。 - 移除 Android 组件重复导入的 PDF 选项类型,修复 UTS bundler 合并时的内部 panic。
- 修复 uni-app x Android 组件在 UTS 合并生成 Kotlin 时,
OpenPdfOptions、ClosePdfOptions等选项类型不可见导致的编译失败。 - 为打开、翻页、搜索、批注和撤销/重做回调补充明确结果类型,公开 API 和运行逻辑保持不变。
- Android UTS 组件代码已变化,升级后需要重新制作并安装匹配的 Android 自定义基座或正式包。
1.4.1(2026-08-25)
- 修复 Android 云打包生成 Kotlin 时,HarmonyOS 专用图片操作名义子类错误进入 Android,调用父类型构造函数缺少必填
type参数,导致compileReleaseKotlin失败。 - Android 生成逻辑改为直接构造包含
type=create-images的强类型PdfProcessOperation;公开 API、原生依赖、权限与 Manifest 均未改变。 - Android UTS 生成代码已变化,升级后需要重新制作并安装匹配的 Android 自定义基座或正式包。
1.4.0(2026-08-24)
- 修复 HarmonyOS 图片转 PDF 操作对象、可空错误消息与原生异常重抛的 ArkTS 严格类型编译错误,并补齐
create-images公开操作类型。 - 新增多图片生成 PDF,支持 A4、Letter、自动/自定义尺寸、方向、边距和 contain/cover/stretch。
- 新增文字/图片水印、页面范围、单个/平铺/九宫格/自定义位置、透明度与旋转。
- 新增页码模板
{page}、{total}、{documentPage}、跳过首页、奇偶页和镜像位置。 - 新增默认串行、最高并发 2 的 PDF 批处理,支持部分失败、
failFast、整批取消和逐项结果。 - 图片支持本地、网络及平台内容 URI;PNG、JPEG、WebP 和 GIF 首帧按平台真实解码,失败返回
9041022。 - 延续 FIFO、取消、加密拒绝、输出重开校验、安全覆盖恢复和 32MP/200MP 图片资源限制。
- Android、iOS、HarmonyOS 原生桥接均有变化,升级后必须重新制作并安装对应匹配自定义基座或正式包。
平台兼容性
uni-app(5.07)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | × | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.07)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | × | √ | √ | √ | × |
lizhao-pdf-pro
一句话能力说明
一套强类型 UTS API 打通 Android、iOS、Web 与 HarmonyOS 的 PDF 阅读、签批、图片生成、文档增强和批量交付流程。
Android/iOS 提供完整原生签批与真实写回;Web 内置 PDF.js 与 pdf-lib;HarmonyOS 使用官方 PDF Kit。四端统一支持九类批注、100 步撤销重做、跨端草稿和新 PDF 写回,uni-app x 额外提供页面内嵌原生 PdfView。
功能特色
- Android 使用系统
PdfRenderer,iOS 使用 PDFKit,不依赖 WebView 截图模拟。 - Web 自带 PDF.js、Worker 与 pdf-lib,安装后即可编译,支持阅读、搜索、九类批注、草稿、撤销重做和真实 PDF 写回。
- HarmonyOS 对接官方 PDF Kit,提供阅读、搜索、九类批注、跨端草稿、新 PDF 写回和页面图片;uni-app x 支持原生内嵌阅读与连续/单页布局。
- 支持本地、网络、密码 PDF、目录、缩略图、正文搜索和任务取消。
- 九类批注:文字、高亮、下划线、删除线、矩形、笔迹、签名、印章、水印。
- 稳定
annotationId、100 步撤销/重做和跨 Android/iOS/Web/HarmonyOS 的版本化草稿。 - 写回生成新 PDF,源文件不变;输出经重新打开校验后原子完成。
- 支持 PNG/JPEG 页面导出、系统打印、系统分享。
- 网络源支持 ETag/Last-Modified、304、过期清理和容量 LRU。
- 会话使用
sessionId + generation隔离,旧异步结果不会覆盖新文档。 - 多张 PNG、JPEG、WebP 或 GIF 首帧可生成 A4、Letter、自动尺寸或自定义尺寸 PDF。
- 支持文字/图片水印、页码变量和默认串行、最高并发 2 的批量交付;单项失败不会吞掉其他结果。
接入方式选择
| 场景 | 推荐方式 | 说明 |
|---|---|---|
| uni-app x 页面内嵌 | <lizhao-pdf-pro /> |
使用标准模式 native-view |
| uni-app App-nvue 页面内嵌 | <lizhao-pdf-pro /> |
使用 App-nvue 原生组件 |
| uni-app 普通 App-vue | 跳转 App-nvue 阅读页 | API 可在 App-vue 调用,原生 View 建议放 App-nvue |
| 只读取信息或批处理 | 仅调用 API | 从插件根目录导入 |
| 多份合同合并归档 | mergePdf |
保持原页面顺序,输出全新的 PDF |
| 按页拆分或抽取附件 | splitPdf / processPdf |
支持重叠拆分项和一基页码范围 |
| 调整页面顺序或方向 | processPdf / rotatePdfPages |
删除、提取、完整重排和旋转可组成流水线 |
| 扫描件或相册图片归档 | createPdfFromImages |
控制页面、方向、边距、图片适配和 EXIF 修正 |
| 合同加水印或页码 | addPdfWatermark / addPdfPageNumbers |
页面范围、透明度、位置和页码变量统一配置 |
| 多份文档批量交付 | batchProcessPdf |
默认串行、失败隔离、可选 failFast 和整批取消 |
| uni-app / uni-app x Web | <lizhao-pdf-pro /> 或 API |
Chrome 支持阅读、搜索、九类批注、草稿与真实写回 |
| uni-app x HarmonyOS | <lizhao-pdf-pro /> 或 API |
官方 PDF Kit 原生视图,支持九类批注、草稿和新 PDF 写回 |
| uni-app HarmonyOS | 原生 API | 阅读与编辑 API 可用;页面内嵌原生组件仅支持 uni-app x |
| 小程序 | 暂不支持 | 明确返回 9041016,不伪造成功 |
文档处理中心
文档处理能力不要求先创建阅读会话。调用后立即返回独立 taskId,任务进入 FIFO 队列;progress 可持续接收读取、处理、校验和发布进度,cancelPdfTask 可取消排队中或执行中的任务。
处理结果始终是新文件或新的 Web Blob URL。默认不覆盖已有文件;显式覆盖时,App 端会先备份旧目标,全部输出重新打开验证成功后才发布。多输入合并不能覆盖任何输入文件,拆分任务遵循“全部成功或全部回滚”。
图片生成与批量交付
最小图片生成示例
import { createPdfFromImages } from "@/uni_modules/lizhao-pdf-pro"
createPdfFromImages({
images: [
{ itemId: 'cover', source: coverImagePath },
{ itemId: 'body', source: bodyImagePath, rotation: 90 }
],
page: {
size: 'a4',
orientation: 'auto',
imageFit: 'contain',
margin: { top: 24, right: 24, bottom: 24, left: 24 }
},
success(res) {
console.log(res.outputFiles[0])
},
fail(error) {
console.error(`${error.errCode}:${error.errMsg}`)
}
})
水印与页码
import { addPdfPageNumbers, addPdfWatermark } from "@/uni_modules/lizhao-pdf-pro"
addPdfWatermark({
input: { source: sourcePdfPath },
watermark: {
kind: 'text',
text: 'INTERNAL',
layout: 'tile',
opacity: 0.2,
rotation: -30
}
})
addPdfPageNumbers({
input: { source: sourcePdfPath },
pageNumber: {
template: '{page} / {total}',
startNumber: 1,
position: 'bottom-center',
mirrorOddEven: false
}
})
英文和数字使用上述最小配置即可跨四端运行。中文字体边界如下:
- iOS 使用系统 PingFang,可直接绘制中文。
- Android 需通过
fontSource传入 App 可读的 TTF/OTF 本地路径;否则明确失败,不输出方框。 - HarmonyOS 可通过
fontSource传入可读字体路径,上线前应在目标设备核对字形覆盖。 - Web 当前仅支持标准英文/数字字体;中文或自定义字体返回
9041016。
Android/HarmonyOS 中文配置示例:watermark: { kind: 'text', text: '内部资料', fontSource: fontPath }。字体文件必须具有合法嵌入和商用授权。
批量交付
import { batchProcessPdf } from "@/uni_modules/lizhao-pdf-pro"
batchProcessPdf({
concurrency: 1,
failFast: false,
items: [
{
itemId: 'contract-a',
inputs: [{ source: firstPdfPath }],
operations: [{ type: 'page-number', pageNumber: { template: '{page}/{total}' } }]
},
{
itemId: 'contract-b',
inputs: [{ source: secondPdfPath }],
operations: [{ type: 'rotate', selection: { pages: [1] }, degrees: 90 }]
}
],
success(res) {
console.log(`成功 ${res.successCount},失败 ${res.failedCount},取消 ${res.cancelledCount}`)
}
})
批次正常完成调度后触发顶层 success,单项失败记录在 items 中;只有批次参数或调度器本身失败才触发顶层 fail。
createPdfFromImages(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| images | PdfImageSource[] | 是 | 1 到 50 张有序图片 | 无 | source / sourceType / itemId / rotation |
| page | PdfImagePageOptions | 否 | 页面和图片适配配置 | A4 自动方向 | size / orientation / imageFit / margin / width / height |
| autoFixExif | boolean | 否 | 自动纠正图片方向 | true |
true / false |
| maxImagePixels | number | 否 | 单张像素限制,只能收紧 | 32000000 |
正整数 |
| maxImageTotalPixels | number | 否 | 合计像素限制,只能收紧 | 200000000 |
正整数 |
| progress | function | 否 | 持续返回阶段与单调进度 | 无 | 无 |
| success | function | 否 | 输出发布并重开校验后触发 | 无 | 无 |
| fail | function | 否 | 参数、读取、解码或写出失败 | 无 | 无 |
| complete | function | 否 | success 或 fail 后精确触发一次 | 无 | 无 |
batchProcessPdf(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| items | PdfBatchItem[] | 是 | 1 到 50 个独立 PDF 项目 | 无 | itemId / inputs / operations / output |
| concurrency | number | 否 | 同时执行的项目数 | 1 |
1 / 2 |
| failFast | boolean | 否 | 首个失败后取消未开始项目 | false |
true / false |
| progress | function | 否 | 子任务进度 | 无 | 无 |
| success | function | 否 | 调度完成后返回逐项终态 | 无 | 无 |
| fail | function | 否 | 批次参数或调度器失败 | 无 | 无 |
| complete | function | 否 | success 或 fail 后精确触发一次 | 无 | 无 |
场景选择表
| 业务目标 | 推荐 API | 说明 |
|---|---|---|
| 两份或多份 PDF 直接合并 | mergePdf |
最少参数,保持输入和页面顺序 |
| 一份 PDF 拆成多份 | splitPdf |
每个拆分项声明自己的页码选择 |
| 只旋转指定页面 | rotatePdfPages |
角度仅支持 90 / 180 / 270 |
| 提取、删除、排序或组合处理 | processPdf |
操作按声明顺序作用于前一步结果 |
| 取消耗时处理 | cancelPdfTask |
使用 processPdf 返回的 taskId |
最小合并示例
import { mergePdf } from "@/uni_modules/lizhao-pdf-pro"
const taskId = mergePdf({
inputs: [
{ source: firstPdfPath, sourceType: 'local' },
{ source: secondPdfPath, sourceType: 'local' }
],
output: { path: mergedPdfPath, overwrite: false },
progress(res) {
console.log(`合并进度:${res.progress}%`)
},
success(res) {
console.log(`已生成 ${res.outputFiles.length} 份 PDF`)
},
fail(error) {
console.error(`${error.errCode}:${error.errMsg}`)
},
complete() {
console.log('合并任务结束')
}
})
拆分示例
import { splitPdf } from "@/uni_modules/lizhao-pdf-pro"
splitPdf({
input: { source: contractPath, sourceType: 'local' },
parts: [
{ name: 'cover', selection: { pages: [1] } },
{ name: 'body', selection: { ranges: [{ start: 2, end: 8 }] } }
],
output: {
directory: outputDirectory,
baseName: 'contract',
overwrite: false
},
success(res) {
console.log(`拆分输出:${res.outputCount}`)
},
fail(error) {
console.error(`${error.errCode}:${error.errMsg}`)
}
})
不同拆分项可以选取相同页面;单个拆分项内部不能出现重复页码。
旋转示例
import { rotatePdfPages } from "@/uni_modules/lizhao-pdf-pro"
rotatePdfPages({
input: { source: sourcePath, sourceType: 'local' },
selection: {
pages: [1],
ranges: [{ start: 3, end: 5 }]
},
degrees: 90,
output: { path: rotatedPath },
success(res) {
console.log(res.outputFiles[0])
}
})
组合流水线示例
import { processPdf } from "@/uni_modules/lizhao-pdf-pro"
processPdf({
inputs: [{ source: sourcePath, sourceType: 'local' }],
operations: [
{ type: 'extract', selection: { ranges: [{ start: 1, end: 10 }] } },
{ type: 'delete', selection: { pages: [2] } },
{ type: 'reorder', order: [9, 8, 7, 6, 5, 4, 3, 2, 1] },
{ type: 'rotate', selection: { pages: [1] }, degrees: 90 },
{
type: 'split',
parts: [
{ name: 'first', selection: { ranges: [{ start: 1, end: 4 }] } },
{ name: 'second', selection: { ranges: [{ start: 5, end: 9 }] } }
]
}
],
output: { directory: outputDirectory, baseName: 'processed' },
fail(error) {
console.error(`${error.errCode}:${error.errMsg}`)
}
})
流水线限制:多输入第一项必须是 merge;单输入不能使用 merge;split 必须是最后一步;reorder.order 必须包含当前文档全部页码且每页只出现一次。
processPdf(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| inputs | PdfProcessSource[] | 是 | 1 到 50 个 PDF 输入 | 无 | source / sourceType |
| operations | PdfProcessOperation[] | 是 | 顺序执行的页面处理流水线 | 无 | merge / extract / delete / reorder / rotate / split / watermark / page-number |
| output | PdfProcessOutput | 否 | 单输出路径或拆分输出目录 | 平台安全输出位置 | path / directory / baseName / overwrite |
| maxInputs | number | 否 | 客户侧输入数量限制,只能收紧 | 50 |
1..50 |
| maxPages | number | 否 | 客户侧总页数限制,只能收紧 | 2000 |
1..2000 |
| maxSingleFileBytes | number | 否 | 客户侧单文件限制,只能收紧 | 268435456 |
正整数 |
| maxTotalFileBytes | number | 否 | 客户侧输入合计限制,只能收紧 | 536870912 |
正整数 |
| progress | function | 否 | 持续返回阶段和单调进度 | 无 | 无 |
| success | function | 否 | 全部输出发布并验证后触发 | 无 | 无 |
| fail | function | 否 | 参数、读取、处理、取消或发布失败 | 无 | 无 |
| complete | function | 否 | success 或 fail 后精确触发一次 | 无 | 无 |
文档处理返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| taskId | string | 独立于阅读会话的处理任务 ID |
| outputFiles | string[] | 输出路径或 Web Blob URL |
| inputCount | number | 输入文件数量 |
| outputCount | number | 输出文件数量 |
| pageCounts | number[] | 每份输出的页数 |
| durationMs | number | 处理耗时,单位毫秒 |
| cancelled | boolean | 成功结果固定为 false;取消通过 9041013 返回 |
最小 uni-app x 示例
<template>
<lizhao-pdf-pro
class="viewer"
:source="source"
:password="password"
display-mode="continuous"
@load="onLoad"
@error="onError"
/>
</template>
<script setup lang="uts">
import { PdfProFail } from "@/uni_modules/lizhao-pdf-pro"
// source 应来自文件选择器、下载结果或业务参数。
const source = ref('')
// 密码只用于当前打开请求,插件不会记录密码。
const password = ref('')
function onLoad(result: UTSJSONObject): void {
const info = result['info'] as UTSJSONObject
console.log(`PDF 共 ${info['pageCount']} 页`)
}
function onError(error: PdfProFail): void {
console.error(`${error.errCode}:${error.errMsg}`)
}
</script>
uni-app App-nvue 示例
普通 App-vue 页面建议跳转独立 App-nvue 页面,再嵌入组件:
<template>
<lizhao-pdf-pro :source="source" @load="onLoad" @error="onError" />
</template>
<script>
export default {
data() {
return { source: '' }
},
methods: {
onLoad(result) {
console.log(`PDF 共 ${result.info.pageCount} 页`)
},
onError(error) {
console.error(`${error.errCode}:${error.errMsg}`)
}
}
}
</script>
Web 最小示例
Web 与 App 使用同一个组件标签和公开 API。插件已内置 PDF.js,不需要在客户项目中再次安装 pdfjs-dist。
<template>
<lizhao-pdf-pro
class="viewer"
:source="networkPdfUrl"
display-mode="continuous"
@load="onLoad"
@error="onError"
/>
</template>
<script>
export default {
data() {
return {
// Web 推荐使用 HTTPS 且允许跨域访问的 PDF 地址。
networkPdfUrl: 'https://example.com/contracts/demo.pdf'
}
},
methods: {
onLoad(result) {
console.log(`Web PDF 已打开,共 ${result.info.pageCount} 页`)
},
onError(error) {
// 跨域、密码、损坏文件等场景都会进入 fail/error,不会伪造成功。
console.error(`${error.errCode}:${error.errMsg}`)
}
}
}
</script>
Web 端如果 PDF 位于其他域名,服务端必须允许浏览器跨域读取;插件无法绕过浏览器同源策略。
Web 批注、草稿与真实写回
Web 使用与 App 相同的公开 API。编辑状态保留在会话中,exportPdf 创建新的 PDF Blob 地址,不会覆盖输入文件。
import {
addPdfAnnotation,
exportPdf,
openPdf
} from "@/uni_modules/lizhao-pdf-pro"
openPdf({
source: selectedFile,
editable: true,
success: (opened) => {
const now = Date.now()
addPdfAnnotation({
sessionId: opened.sessionId,
annotation: {
annotationId: `review-${now}`,
type: 'rectangle',
page: 1,
bounds: { x: 0.1, y: 0.12, width: 0.35, height: 0.18 },
points: [],
text: '',
color: '#2563EB',
opacity: 0.85,
lineWidth: 2,
assetPath: '',
rotation: 0,
pageWidth: 0,
pageHeight: 0,
coordinateVersion: 1,
createdAt: now,
updatedAt: now,
extra: null
},
success: () => {
exportPdf({
sessionId: opened.sessionId,
validateOutput: true,
success: (result) => console.log(`新 PDF:${result.path}`),
fail: (error) => console.error(error.errMsg)
})
}
})
}
})
文字与水印会转成透明图片写入 PDF;签名和印章支持 PNG/JPEG 的本地、Blob 或 HTTP(S) 资源。加密 PDF 在浏览器端无法安全重写时会返回明确错误,不会伪造成功。
HarmonyOS 批注、草稿与真实写回
HarmonyOS 与 Android、iOS、Web 使用同一套公开 API 和草稿结构。用 editable: true 打开后即可新增批注、撤销重做、导出草稿,并把完整编辑状态写入一个新的 PDF 文件。
HarmonyOS 九类批注
| 类型 | type |
必要内容 |
|---|---|---|
| 文字 | text |
text |
| 高亮 | highlight |
bounds |
| 下划线 | underline |
bounds |
| 删除线 | strikeout |
bounds |
| 矩形 | rectangle |
bounds |
| 手写 | ink |
至少两个 points |
| 签名 | signature |
本地 PNG/JPEG assetPath |
| 印章 | stamp |
本地 PNG/JPEG assetPath |
| 水印 | watermark |
text 或本地图片 assetPath |
import {
addPdfAnnotation,
exportPdf,
exportPdfDraft,
openPdf
} from "@/uni_modules/lizhao-pdf-pro"
openPdf({
source: selectedPdfPath,
editable: true,
success: (opened) => {
const now = Date.now()
addPdfAnnotation({
sessionId: opened.sessionId,
annotation: {
annotationId: `harmony-review-${now}`,
type: 'highlight',
page: 1,
bounds: { x: 0.1, y: 0.18, width: 0.5, height: 0.08 },
points: [],
text: '',
color: '#FFD54F',
opacity: 0.5,
lineWidth: 2,
assetPath: '',
rotation: 0,
pageWidth: 0,
pageHeight: 0,
coordinateVersion: 1,
createdAt: now,
updatedAt: now,
extra: null
},
success: () => {
// 草稿可在 Android、iOS、Web 与 HarmonyOS 间流转。
exportPdfDraft({ sessionId: opened.sessionId })
// outputPath 必须与源文件不同,成功结果使用 result.path。
exportPdf({
sessionId: opened.sessionId,
outputPath: customerOutputPath,
overwrite: false,
validateOutput: true
})
}
})
}
})
加密 PDF 可以阅读、添加进程内批注并导入/导出草稿。HarmonyOS 在不能确保原密码和安全属性完整保留时会拒绝真实写回并返回 9041011,不会调用移除安全设置的接口,也不会生成未加密副本。
网络、密码、搜索和取消
import {
cancelPdfTask,
openPdf,
searchPdfText
} from "@/uni_modules/lizhao-pdf-pro"
openPdf({
source: networkUrl,
sourceType: 'network',
password: userInputPassword,
success: (opened) => {
const taskId = searchPdfText({
sessionId: opened.sessionId,
keyword: '审批意见',
success: (result) => console.log(`命中 ${result.matches.length} 项`),
fail: (error) => console.error(error.errMsg),
complete: (_result) => console.log('搜索结束')
})
// 用户点击取消时传入原搜索任务 ID。
cancelPdfTask({ sessionId: opened.sessionId, taskId })
},
fail: (error) => console.error(error.errMsg),
complete: (_result) => console.log('打开流程结束')
})
9041005 表示需要密码,9041006 表示密码错误。公开页码均从 1 开始。
批注、草稿和真实写回
编辑前需使用 editable: true 打开文档。批注坐标采用左上角原点的归一化值,x / y / width / height 范围为 0..1。
import {
addPdfAnnotation,
exportPdf,
openPdf
} from "@/uni_modules/lizhao-pdf-pro"
openPdf({
source: selectedPdfPath,
editable: true,
success: (opened) => {
const now = Date.now()
addPdfAnnotation({
sessionId: opened.sessionId,
annotation: {
annotationId: `signature-${now}`,
type: 'signature',
page: 1,
bounds: { x: 0.55, y: 0.72, width: 0.3, height: 0.12 },
points: [],
text: '',
color: '#000000',
opacity: 1,
lineWidth: 2,
assetPath: selectedSignaturePath,
rotation: 0,
pageWidth: 0,
pageHeight: 0,
coordinateVersion: 1,
createdAt: now,
updatedAt: now,
extra: null
},
success: () => {
exportPdf({
sessionId: opened.sessionId,
outputPath: customerOutputPath,
overwrite: false,
validateOutput: true
})
}
})
}
})
- 草稿使用
schemaVersion=1和coordinateVersion=1。 exportPdf始终生成新 PDF,不修改会话源文件。- 同一会话只能执行一个 PDF 导出;冲突返回
9041017。 - Android 分享成功表示系统面板已呈现;系统无法确认目标 App 最终发送,因此
completed=false。
完整示例
- uni-app App-nvue:
uni_modules/lizhao-pdf-pro/example/uniapp/pdfPro.nvue - uni-app x:
uni_modules/lizhao-pdf-pro/example/uniappx/index.uvue
完整示例包含阅读、搜索、批注签章、草稿、写回、页面图片、打印分享和缓存管理。
组件 API
属性
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| source | string | 否 | 本地路径、URI 或网络地址 | 空字符串 | 无 |
| password | string | 否 | 当前 PDF 密码 | 空字符串 | 无 |
| displayMode | string | 否 | 展示模式 | continuous |
continuous / single |
| editable | boolean | 否 | 是否启用编辑 | false |
true / false |
| showNavigation | boolean | 否 | Web 是否显示上一页、页码和下一页工具栏 | false |
true / false |
| showOutline | boolean | 否 | Web 是否显示可展开的真实 PDF 目录 | false |
true / false |
| followPageScroll | boolean | 否 | Web 是否跟随外层页面滚动 | false |
true / false |
| pagePadding | number | 否 | Web PDF 页面左右留白,单位 px | 12 |
0 或正数 |
showNavigation / showOutline / followPageScroll / pagePadding 是 Web 阅读体验增强属性;原生端翻页和目录仍通过公开 API 或示例工作台控制。
事件
| 事件 | 返回内容 | 触发时机 |
|---|---|---|
@load |
打开结果与 info |
PDF 已解析且首屏可以渲染 |
@progress |
stage / progress / result |
打开、搜索等阶段进度变化 |
@page-change |
sessionId / page / pageCount |
组件方法完成翻页 |
@annotation-change |
annotationId / action |
批注新增、更新或删除成功 |
@error |
PdfProFail |
打开、渲染、搜索或编辑失败 |
组件方法
通过组件 ref 调用。调用前应等待 @load,组件卸载后不要继续复用旧实例。
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
reload() |
无 | string |
重新打开当前 source |
goToPage(page) |
一基页码 | string |
跳转页面并触发 @page-change |
search(keyword) |
搜索词 | string |
搜索正文并通过 @progress 返回结果 |
cancelTask(taskId) |
任务 ID | string |
取消搜索、缩略图或导出任务 |
addAnnotation(annotation) |
PdfAnnotation |
string |
新增批注 |
updateAnnotation(annotation) |
PdfAnnotation |
string |
按稳定 ID 更新批注 |
removeAnnotation(annotationId) |
批注 ID | string |
删除批注 |
undoEdit() |
无 | string |
撤销最近一次编辑 |
redoEdit() |
无 | string |
重做最近一次撤销 |
<template>
<lizhao-pdf-pro
ref="pdfViewer"
:source="source"
@load="onReady"
@page-change="onPageChange"
/>
</template>
<script>
export default {
data() {
return { source: '', ready: false }
},
methods: {
onReady() {
// @load 后再调用组件实例方法。
this.ready = true
},
nextPage() {
if (this.ready) this.$refs.pdfViewer.goToPage(2)
},
onPageChange(result) {
console.log(`当前第 ${result.page} 页`)
}
}
}
</script>
API 列表
所有 API 均从 @/uni_modules/lizhao-pdf-pro 根目录导入。
| API | 说明 |
|---|---|
openPdf / closePdf |
打开或关闭会话 |
getPdfState / getPdfInfo |
获取状态和文档信息 |
goToPdfPage / setPdfDisplay |
翻页和展示模式 |
getPdfOutline / getPdfThumbnails |
目录和缩略图 |
searchPdfText / cancelPdfTask |
搜索和取消任务 |
addPdfAnnotation / updatePdfAnnotation / removePdfAnnotation / getPdfAnnotations |
批注增删改查 |
undoPdfEdit / redoPdfEdit |
最多 100 步撤销重做 |
exportPdfDraft / importPdfDraft |
草稿导入导出 |
exportPdf |
真实写回到新 PDF |
exportPdfPageImage |
导出 PNG/JPEG 页面图片 |
printPdf / sharePdf |
系统打印和分享 |
getPdfCacheInfo / clearPdfCache |
缓存统计和选择性清理 |
processPdf |
合并、提取、删除、重排、旋转和拆分的统一流水线 |
mergePdf / splitPdf / rotatePdfPages |
高频文档处理便捷 API |
能力与平台差异
“明确失败”表示 API 保持一致,但会通过 fail 和 complete 返回 9041016,不会返回虚假成功。
| 能力 | Android | iOS | Web Chrome | HarmonyOS |
|---|---|---|---|---|
| 本地 PDF | 是 | 是 | 浏览器可访问地址 | 是 |
| 网络 PDF | 是 | 是 | 是,受浏览器 CORS 约束 | 是 |
| 密码 PDF | 是 | 是 | 是 | 是 |
| 文档信息与翻页 | 是 | 是 | 是 | 是 |
| 目录与缩略图 | 是 | 是 | 是 | 是 |
| 全文搜索与取消 | 是 | 是 | 是 | 是 |
| 页面图片导出 | 是 | 是 | 是,返回 Blob URL | 是 |
| 九类批注 | 是 | 是 | 是 | 是 |
| 草稿导入导出 | 是 | 是 | 是 | 是 |
| 非加密 PDF 真实写回 | 是 | 是 | 是 | 是 |
| 合并、拆分、提取、删除、排序、旋转 | 是 | 是 | 是 | 是,API 12+ |
| 处理进度、FIFO 排队和取消 | 是 | 是 | 是 | 是 |
| 加密 PDF 文档处理 | 明确拒绝 | 明确拒绝 | 明确拒绝 | 明确拒绝 |
| 加密 PDF 真实写回 | 按原生能力 | 按原生能力 | 明确失败 | 明确失败,草稿可用 |
| 系统打印 | 是 | 是 | 浏览器打印 | 明确失败 |
| 系统分享 | 是 | 是 | Web Share 或下载降级 | 明确失败 |
openPdf(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| source | string | 是 | 本地路径、URI 或网络地址 | 无 | 无 |
| sourceType | string | 否 | 来源类型 | 自动识别 | local / network / content-uri |
| password | string | 否 | 当前文档密码 | 空字符串 | 无 |
| editable | boolean | 否 | 是否启用编辑 | false |
true / false |
| maxFileSize | number | 否 | 最大文件字节数 | 524288000 |
无 |
| success | function | 否 | 成功回调 | 无 | 无 |
| fail | function | 否 | 失败回调 | 无 | 无 |
| complete | function | 否 | 完成回调 | 无 | 无 |
searchPdfText(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| sessionId | string | 是 | 已打开的 PDF 会话 | 无 | 无 |
| keyword | string | 是 | 搜索关键词 | 无 | 无 |
| startPage | number | 否 | 起始一基页码 | 1 |
无 |
| endPage | number | 否 | 结束一基页码 | 文档末页 | 无 |
| caseSensitive | boolean | 否 | 是否区分大小写 | false |
true / false |
| maxResults | number | 否 | 最大返回数量 | 100 |
1..1000 |
| success | function | 否 | 搜索成功回调 | 无 | 无 |
| fail | function | 否 | 搜索失败回调 | 无 | 无 |
| complete | function | 否 | 搜索结束回调 | 无 | 无 |
exportPdf(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| sessionId | string | 是 | 以 editable=true 打开的会话 |
无 | 无 |
| outputPath | string | 否 | 新 PDF 输出路径 | 插件安全输出目录 | 无 |
| overwrite | boolean | 否 | 是否允许覆盖同名输出 | false |
true / false |
| validateOutput | boolean | 否 | 写回后重新打开校验 | true |
true / false |
| success | function | 否 | 写回成功回调 | 无 | 无 |
| fail | function | 否 | 写回失败回调 | 无 | 无 |
| complete | function | 否 | 写回结束回调 | 无 | 无 |
clearPdfCache(options) 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| sessionId | string | 否 | 仅清理指定会话可清理资源 | 无 | 无 |
| includeSource | boolean | 否 | 清理未被活动会话占用的源缓存 | false |
true / false |
| includeRender | boolean | 否 | 清理页面与缩略图渲染缓存 | false |
true / false |
| includeDraft | boolean | 否 | 清理插件生成的草稿缓存 | false |
true / false |
| includeOutput | boolean | 否 | 清理插件生成且允许清理的输出 | false |
true / false |
| success | function | 否 | 清理成功回调 | 无 | 无 |
| fail | function | 否 | 清理失败回调 | 无 | 无 |
| complete | function | 否 | 清理结束回调 | 无 | 无 |
通用结果字段
| 字段 | 类型 | 说明 |
|---|---|---|
| sessionId | string | PDF 会话 ID |
| taskId | string | 可取消任务 ID |
| generation | number | 会话代次 |
错误码
| 错误码 | 含义 | 说明 |
|---|---|---|
| 9041001 | 参数错误 | source、页码或参数不合法 |
| 9041002 | 来源不支持 | 路径或 URI 不可读取 |
| 9041003 | 下载失败 | 网络请求或临时文件失败 |
| 9041004 | 文档无效 | PDF 损坏或无法解析 |
| 9041005 | 需要密码 | 未提供密码 |
| 9041006 | 密码错误 | 解密失败 |
| 9041007 | 会话不存在 | 会话已关闭或无效 |
| 9041008 | 渲染失败 | 页面或图片生成失败 |
| 9041009 | 搜索失败 | 文本提取失败 |
| 9041010 | 批注不合法 | ID、页码、坐标或资源错误 |
| 9041011 | 写回失败 | PDF、草稿或输出保存失败 |
| 9041012 | 输出校验失败 | 新 PDF 无法重开或校验不一致 |
| 9041013 | 任务已取消 | 用户取消耗时任务 |
| 9041014 | 权限不足 | 输入不可读或输出不可写 |
| 9041015 | 资源超限 | 文件、页面或任务超过限制 |
| 9041016 | 平台不支持 | 当前平台或系统能力不可用 |
| 9041017 | 导出冲突 | 同会话已有导出任务 |
| 9041018 | 流水线不合法 | 多输入未 merge、单输入 merge 或 split 不是最后一步 |
| 9041019 | 页码规则不合法 | 页码越界、重复、拆分为空或排序不是完整排列 |
| 9041020 | 安全策略拒绝 | 文档处理检测到加密 PDF,不会静默解密 |
| 9041021 | 发布恢复失败 | 输出原子发布、覆盖备份或失败恢复未完成 |
| 9041022 | 图片解码失败 | 图片格式不支持、文件损坏或首帧解码失败 |
支持平台
| 平台 | 是否支持 | 说明 |
|---|---|---|
| uni-app x App-Android | 是 | 标准组件和 API |
| uni-app x App-iOS | 是 | 标准组件和 API |
| uni-app App-nvue Android/iOS | 是 | 原生组件和 API |
| uni-app 普通 App-vue | 部分 | API 可用;内嵌阅读建议跳转 App-nvue |
| uni-app Web Chrome | 是 | 内置 PDF.js 与 pdf-lib;阅读签批、真实写回和六类文档处理 |
| uni-app x Web Chrome | 是 | 与 uni-app 共用公开 API;文档处理返回新的 Blob URL |
| Web Safari | 待验证 | 未完成 macOS Safari 实机验收,不提前标记支持 |
| uni-app HarmonyOS | API 支持 | API 12+;阅读签批、非加密 PDF 写回和六类文档处理 |
| uni-app x HarmonyOS | 是 | API 12+;完整 API、六类处理与内嵌原生 PdfView,需新基座真机验收 |
| 小程序 | 否 | 返回 9041016 |
权限、缓存与自定义基座
- 网络 PDF 需要网络权限;本地文件需由业务取得合法读取权限。
- 密码、完整路径、URL、批注正文和签章图片不会写入插件日志。
clearPdfCache默认不删除任何层,活动会话源文件始终受保护。- 页面图片建议保持默认最大长边 2048;大文档预览优先使用缩略图 API。
- 文档处理最多 50 个输入、2000 页、单文件 256 MiB、合计 512 MiB;App 端临时可用空间至少为预计输出的两倍再加 64 MiB。
- 加密 PDF 可以继续按既有阅读能力打开,但
processPdf处理链路统一返回9041020,不接受密码字段,也不会生成未加密副本。 - 本插件包含 Android Kotlin、iOS Swift 和 Android PDFBox 依赖,首次接入或原生代码更新后必须重新制作对应平台自定义基座。
- HarmonyOS 核心桥接要求 HarmonyOS 5.0.0(API 12) 及以上和
SystemCapability.OfficeService.PDFService.Core。 - uni-app x HarmonyOS 组件使用官方内嵌
PdfView;安装新自定义基座后,应在业务真机验证本地/网络文件、九类批注、草稿往返、新 PDF 写回、连续/单页切换和销毁重建。 - appResource/WGT 不能替换已经编译进旧基座的原生代码。
第三方许可见 THIRD_PARTY_NOTICES.md。
常见问题
为什么打开网络 PDF 失败,但浏览器直接访问地址正常?
Web 必须满足浏览器跨域规则。请检查 PDF 响应是否允许当前站点域名、HTTPS 页面是否请求了 HTTP 资源,以及鉴权 Cookie/请求头是否能在浏览器环境中发送。Android/iOS 网络下载不受浏览器 CORS 限制,但仍受业务鉴权和网络安全配置约束。
为什么普通 App-vue 页面不直接显示原生 PDF View?
Android/iOS 的完整阅读器是原生 View。uni-app 普通 App-vue 建议跳转到独立 App-nvue 阅读页;uni-app x 可直接使用标准模式组件。只调用信息、搜索、导出等 API 时不要求页面嵌入组件。
为什么 Web 批注成功,但页面上看不到签名或导出失败?
签名和印章必须是浏览器可读取的 PNG/JPEG,本地文件建议使用文件选择器得到的 Blob;远程资源需要满足 CORS。加密 PDF、损坏资源或并发导出会进入 fail,不会生成看似成功的空文件。导出结果是新的 Blob 地址,关闭其新会话后该地址会被释放。
密码会不会被缓存或打印到日志?
不会。密码只参与当前打开请求;插件日志不记录密码、完整 URL、完整本地路径、批注正文和签章图片内容。
页码和批注坐标怎么计算?
公开页码从 1 开始。批注坐标使用左上角原点的归一化坐标,x / y / width / height 范围为 0..1,这样草稿可以跨 Android/iOS/Web/HarmonyOS 和不同页面尺寸复用。
为什么改完插件后页面更新了,但原生能力没变化?
Android Kotlin、iOS Swift、HarmonyOS UTS 原生代码和原生依赖会编译进自定义基座。修改这些文件后必须重新原生联编或重做对应平台自定义基座;仅更新 WGT/appResource 不能替换旧基座里的原生代码。
推荐业务组合
| 业务场景 | 推荐组合 | 价值 |
|---|---|---|
| 合同选取与签批 | lizhao-choose-file + lizhao-pdf-pro |
选择 PDF、阅读、签名盖章、导出新合同 |
| 纸质材料电子化 | lizhao-doc-corrector + lizhao-pdf-pro |
拍照矫正、生成材料、进入审批阅读 |
| 合同归档 | lizhao-pdf-pro + lizhao-sqlite-pro |
PDF 真实写回、索引信息和本地业务记录 |
| 审批结果分享 | lizhao-pdf-pro + lizhao-share-plus |
导出新 PDF 后调用系统分享 |
| 风控设备识别 | lizhao-device-id + lizhao-emu-detect + lizhao-pdf-pro |
设备标识、环境风险与签批流程组合 |
作者系列 UTS 插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12593411
赞赏 1949
赞赏
京公网安备:11010802035340号