更新记录
1.0.0(2026-11-07)
- 新增 iOS 的 Swift / UTS 五 API 适配及同源 LibreOfficeKit 移植代码;Apple 内核制品、严格离线保护与真机转换尚未完成,当前不可用,不代表已经支持 iOS 转换。
- 新增:首版提供 Android ARM64 本地 DOC、DOCX、PPT、PPTX 转 PDF,文档不上传,不使用云端转换或联网回退。
- 新增:提供系统文件选择、转换、取消、能力查询、诊断查询及 Android 原生连续预览六个公开 API,包含真实阶段、成功 / 失败 / 完成回调及 18 类可识别错误。
- 新增:支持文件大小限制和总超时,默认输入上限 50 MiB、总超时 120 秒;单活动任务,忙碌、取消、超时与原生资源释放状态明确区分。
- 新增:转换结果经 PDF 校验后保存到应用私有持久目录,返回路径、页数、字节数和耗时;保护输入原件及已交付结果,临时清理限制在本次任务范围。
- 新增:提供 uni-app(Vue 2 / Vue 3 通用选项式 API)与 uni-app x 示例,包含完整脱敏诊断报告、一键复制、固定快照分段复制及复制失败回退。
- 新增:Android 同源原生 PDF 连续阅读器及 openOfficePdfPreview,提供连续滚动、页码跳转、缩放、横向查看、轻触工具栏、真实打开回执和独立有界诊断;其他平台明确返回不支持,关闭不删除结果。
- 新增:双宿主示例按体验 APK 统一文件/状态/结果卡片,提供选择并转换、真实内置 Word 样本、再次转换、错误详情与排版提示;保留完整日志复制与手动回退。
- 修复:兼容部分工具导出的 DOCX 空根目录占位;普通网页点击超链接在私有副本中移除并返回数量警告,保留原件、可见文字及内部链接,继续拒绝外部资源和危险输入。
- 修复:部分 DOCX 简单固定布局表格中的嵌入式图片超宽时发生缺图,私有副本按单元格可用宽度等比适配;仅同时命中的纯图片段落将过大的自动行距调整为单倍,并分别返回真实处理数量警告。
- 修复:部分 DOCX 的 90° / 270° 旋转图片带有冗余效果占位时,清除可确认的无效占位,保留图片字节、尺寸和旋转。结果提示可能出现分页差异,复杂或未知布局不自动调整。
- 修复:内核诊断较长时,错误回执可能截掉关键门禁信息;单独保留当前任务的脱敏检查摘要并优先纳入错误回执,方便定位系统差异。此项不改变内核门禁,也不代表 Android 16 客户故障已经修复。
- 修复:Web 示例与诊断报告捕获异常时的类型告警,保留字符串、普通对象及标准异常的真实消息与脱敏;异常消息读取失败不再中断诊断,uni-app 示例由同源生成器同步维护。
- 修复:传统 uni-app Web 编译时无法处理原生回调装饰器的问题;仅 App 分支保留 keepAlive,持续进度与 success/fail/complete 合同不变。
- 优化:示例增加转换加载状态、真实阶段和可用取消入口;成功后可点击预览 PDF,预览有独立加载、失败重试及迟到回执隔离。
- 优化:内核门禁失败报告补充脱敏 errno、检查操作和数量,保留严格拒绝,不进行盲目重试。
- 优化:针对系统拒绝读取既有 socket 类型的兼容问题,增加受限的全线程 I/O 封锁与安装后复查;无法完整封锁、身份变化、已确认网络 socket 和其他检查失败仍拒绝转换。补充封锁数量、安装/复查、返回码及 errno 诊断。客户原机效果需使用匹配新内核的 APK 复验,不能用其他设备结果代替。
- 优化:Android 主体库无损 XZ 压缩,保留四格式及资源;内核 AAR 为 55,717,586 字节,首次使用在私有目录展开并核验,后续复用缓存,运行时不下载 SDK。
- 优化:新任务开始或失败保留上次成功 PDF,并明确预览标识;一键复制采集最新全量报告,备用分段仍使用同一固定快照。
- 调整:Android 内核改用公开 Maven 固定依赖,不随插件主体附带大型 SDK;HBuilderX 原生构建自动下载,无需客户手工补 AAR。接入文档说明真实仓库、身份、试用 / 普通授权、自定义基座与云打包计量边界。
- 调整:明确 Android API 24+、
arm64-v8a与 64 位进程要求。iOS 为不可用的移植源码;Harmony、Web 和小程序暂不支持;Vue 2、nvue、标准 VDOM、最低系统及 16KB 设备按专项验收结论确认。
平台兼容性
uni-app(5.26)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | - | - | √ | √ | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.26)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | √ | × | × |
lizhao-office-pdf
| 演示应用 | 适用平台 | 下载体验 |
|---|---|---|
| Office 转 PDF | Android | 下载演示 APK |
介绍
lizhao-office-pdf 为 uni-app / uni-app x 提供 Android ARM64 本地 Office 转 PDF 能力,将 DOC、DOCX、PPT、PPTX 转为可独立打开的静态 PDF,适用于离线归档、阅读与业务交付。文档在设备本地处理,不上传、不使用云端转换或联网回退。
导入完整插件后,HBuilderX 原生构建通过已配置的公开 Maven 仓库自动取得 Android 内核,客户无需手动下载或拷贝 AAR。下载发生在构建阶段,安装后的转换和 PDF 连续阅读均在本机完成。本目录仍为待发布材料,公开仓储解析通过不代表市场授权、全部宿主及商业发行材料已经验收。
功能特色
| 特色功能 | 能解决什么问题 | 相关 API / 配置 |
|---|---|---|
| 本地四格式转换 | 无网络也可将 Word、PowerPoint 文件转换为 PDF,无需安装 Office 应用 | convertOfficeToPdf,DOC / DOCX / PPT / PPTX |
| 系统选择文件 | 从系统文件选择器导入一份文档,不申请广域存储权限 | chooseOfficePdfFile |
| 真实进度与结果 | 获得真实阶段、任务编号、PDF 路径、页数、大小和耗时 | onProgress、success、fail、complete |
| 取消与总超时 | 区分取消请求、原生退出与资源释放,避免晚到结果误报成功 | cancelOfficePdfTask、timeoutMs |
| 原件与结果保护 | 校验 PDF 后原子保存,后续任务清理不覆盖原件或删除已交付 PDF | OfficePdfResult.outputPath |
| DOCX 图片适配 | 对明确的超宽图片和冗余效果占位进行兼容处理,结果返回实际处理警告 | convertOfficeToPdf、OfficePdfResult.warnings |
| 内置连续阅读 | Android 直接打开转换结果,连续滚动、页码跳转、缩放和横向查看,无需另装 PDF 阅读器 | openOfficePdfPreview |
| 能力与故障诊断 | 查询 ABI、引擎状态,汇总环境、原生错误与脱敏操作轨迹 | getOfficePdfCapabilitiesSync、getOfficePdfDiagnosticsSync |
| 双宿主示例 | 使用真实 API 体验转换、取消及完整日志 / 分段复制 | uni-app 与 uni-app x 示例页面 |
| 仓储自动依赖 | 插件主体不携带大型 SDK,原生构建自动取得固定内核;运行时不下载 SDK | uni_modules/lizhao-office-pdf/utssdk/app-android/config.json |
适合哪些场景
| 场景 | 推荐能力 | 使用边界 |
|---|---|---|
| 离线归档、现场作业 | 系统选择文件后调用 convertOfficeToPdf |
文件必须已经下载到本地并可读取 |
| 合同、报告等私密文档处理 | 本地转换、应用沙盒保存结果 | 不上传文档,业务仍需管理输出文件的保存和分享 |
| 已有本地文件的业务流程 | 传入 local-file 或合法 content-uri |
读取授权、文件真实格式及大小必须有效 |
| 转换前确认设备条件 | getOfficePdfCapabilitiesSync |
需要 Android API 24+、ARM64 进程和匹配内核 |
| 客户问题排查 | 示例底部一键复制完整诊断报告 | 先复现再复制;报告不默认上传 |
不适用于要求轻量包体、ARM32/x86、所有文档与Microsoft Office逐像素一致、文档编辑、宏执行、PPT动画/视频保留、无限后台转换或PDF转Office的业务。扫描图片中文字不包含OCR。
下载与导入
第一步:导入插件主体
插件上架后,在插件市场选择试用或购买,再使用 HBuilderX 导入到自己的 uni-app 或 uni-app x 项目;源码接入则复制完整 uni_modules/lizhao-office-pdf/ 目录。当前待发布,不提供尚未确认的市场详情页链接。
保留插件 ID、目录名、入口、示例、原生配置、内核身份文件及 uni_modules/lizhao-office-pdf/licenses/ 中的许可材料。普通授权、试用和源码接入均使用插件自带的仓储配置,不需要修改加密源码或手工补 SDK。
第二步:保留 Android 自动依赖配置
uni_modules/lizhao-office-pdf/utssdk/app-android/config.json 已声明固定 Maven 坐标及公开 HTTPS 仓库。HBuilderX / 云打包在原生构建阶段解析依赖,读取仓库无需账号、密码或 Token;运行时不访问仓库。客户只需导入完整目录并进行原生打包。
| 项目 | 要求 |
|---|---|
| 仓库 | https://env-00jxu7ha8amh.normal.cloudstatic.cn/lizhao-office-pdf/maven/;下载固定内核 AAR;使用配置文件中的完整地址,不把单个 AAR 下载链接填入 dependencies |
| 依赖 | com.lizhao:office-pdf-kernel;固定版本见 uni_modules/lizhao-office-pdf/utssdk/app-android/config.json,禁止改成动态版本 |
| 内核大小 | 55,717,586 字节,约 55.72 MB / 53.14 MiB |
| SHA-256 | ca66e46ec4e18a503f31827c8f413edb5b65544a5d8655b81fa699867b8093a0 |
| 适用平台 | Android API 24+,arm64-v8a,64 位应用进程 |
| 身份依据 | uni_modules/lizhao-office-pdf/utssdk/app-android/libs/office-pdf-kernel.json,包含仓库、坐标、AAR 与压缩载荷 SHA-256 |
仓库已完成全新 Gradle 缓存的实际公网解析与完整 AAR SHA-256 核对。项目首次构建需要访问仓库;网络不可达时显示构建错误,不会在手机中静默补下载,也不会切换云端文档转换。
升级旧版手工依赖的工程时,先备份自己原有文件,再检查插件 libs 中是否残留旧 AAR;同一 SDK 不应同时通过本地文件和 Maven 重复引入。不要把大型 SDK 放进 static、项目资源或插件发布目录,不修改原生库来消除重复类/重复 SO 错误。
第三步:选择宿主并导入 API
页面只从插件根导入:
import {
chooseOfficePdfFile, convertOfficeToPdf, cancelOfficePdfTask,
getOfficePdfCapabilitiesSync, getOfficePdfDiagnosticsSync, openOfficePdfPreview,
OfficePdfOptions, ChooseOfficePdfFileOptions, OpenOfficePdfPreviewOptions
} from '@/uni_modules/lizhao-office-pdf'
选择宿主对应的完整示例页面,并在自己项目的 pages.json 注册:
- uni-app x:
uni_modules/lizhao-office-pdf/example/uniappx/index.uvue。 - uni-app(Vue 2 / Vue 3 选项式 API):
uni_modules/lizhao-office-pdf/example/uniapp/index.vue,无需额外组合式依赖;页面脚本兼容不等于各宿主原生和真机验收均已完成。 - 示例使用说明:
uni_modules/lizhao-office-pdf/example/readme.md。界面沿用体验 APK 的文件、状态与结果卡片;“选择并转换”自动转换选中文档,“Word 示例”使用随插件交付的真实样本。成功后在 Android 内置连续阅读器打开outputPath;新任务失败仍可预览上次成功 PDF。底部保留完整日志、分段及复制失败回退。
第四步:制作自定义基座或打包应用
- 确认开发环境为 HBuilderX 5.26+,目标 Android 为 API 24+,应用架构选择 ARM64 /
arm64-v8a。当前内核不包含 ARM32 或 x86 版本。 - 保留自动依赖配置,提交包含本插件的 Android 原生打包;SDK 由构建服务下载。调试使用匹配源码的自定义基座;普通标准基座不能运行该内核。
- 试用用户:从插件市场申请试用后,按平台规则云打包自定义基座进行测试,不能将试用插件用于正式发行。
- 普通授权用户:保留市场加密代码,使用已购买授权绑定的 AppID / 包名,按平台规则提交云打包。公开 SDK 依赖不代替购买或授权验证。DCloud 付费插件说明
- 安装新的自定义基座后,再运行对应示例。首次能力为
pending时,可发起转换完成后台校验;不是只有显示ready才能首次使用。缺失、错误架构或不匹配的内核应先修正,不能把页面可打开当作内核可用。 - 内核、仓储依赖或新增原生阅读器变化时,重新联编 / 打自定义基座;更新后核对原生身份与页面资源。WGT 不能把 SDK 或原生阅读器更新到旧基座。
仓储配置遵循 UTS 的 Android config.json 接入规则。本插件的实际市场试用、普通授权云打包仍需分别验收,公网 Gradle 解析不能替代市场流程。
仓储依赖减少随工程提交的大文件,但不保证任意客户工程免费云打包。 官方计量还涉及项目编译后、压缩前的完整材料及最终安装包,其他代码、插件、图标和资源都会占用额度。当前压缩内核约 55.72 MB;本插件独立体验 APK 小于 60 MB,均不能代替完整客户工程计量。DCloud 云打包规则
不要同时加入旧 Office 预览插件的可选离线内核;发现重复类或原生库时,先核实依赖来源,不通过盲目 pickFirst 掩盖冲突。
接入常见问题
| 现象 | 先检查什么 | 处理方法 |
|---|---|---|
| 构建提示无法解析内核依赖 | 是否保留完整 config.json;构建服务能否访问公开仓库 | 按第二步核对配置和原始解析错误,不把 AAR URL 填入 dependencies |
| 同名内核哈希不符 | 插件与依赖是否来自不同交付批次、缓存是否异常 | 按随插件的内核身份核对固定坐标、字节数和 SHA-256,不能改名掩盖 |
已打包,手机仍报 ENGINE_UNAVAILABLE |
手机是否仍运行旧标准 / 自定义基座,ABI 是否为 ARM64 | 安装匹配新依赖的自定义基座,复制完整报告核对真实原生身份 |
| Android 预览未打开 | filePath 是否直接来自转换成功结果,是否重新原生联编 | 仅传插件交付的私有 PDF,保留失败详情;预览失败不删除结果 |
| 重复类、重复 SO、C++ 冲突 | 是否同时装入另一 Office 内核或其他 SDK 的运行库 | 核对依赖来源及本说明“已验证范围与 C++ 依赖”,不要删除任意原生库绕过 |
从基础到进阶:按业务模块使用
模块一:选择本地文件并转换
最小路径为“系统选择 → 将成功返回的本地副本传入转换 → 在success中使用PDF”。来源须为真实本地文件;网络URL会被拒绝。默认输入上限50MiB,总超时120000毫秒,包括准备、引擎校验、转换、PDF校验与结果提交。
uni-app x:使用 UTS 类型
在已注册页面的按钮事件或业务方法中执行下方代码;真实完整页面为 uni_modules/lizhao-office-pdf/example/uniappx/index.uvue。上方的根导入提供所需 API 和类型。
const chooseOptions: ChooseOfficePdfFileOptions = {
success: (selected) => {
const options: OfficePdfOptions = {
source: { kind: 'local-file', uri: selected.localPath },
format: selected.format,
timeoutMs: 120000,
success: (result) => {
console.log('PDF已生成', result.outputPath, result.pageCount, result.fileSize)
openOfficePdfPreview({
filePath: result.outputPath,
fail: (error) => { console.error('打开失败,PDF仍已生成', error.errMsg) }
})
},
fail: (error) => {
console.error('转换未成功', error.errSubject, error.errCode, error.reason, error.nativeCode)
},
complete: (result) => { console.log('本次转换回调结束', result.taskId, result.success) }
}
const taskId = convertOfficeToPdf(options)
console.log('转换任务编号', taskId)
},
fail: (error) => { console.error('选文件未成功', error.errCode, error.reason) }
}
chooseOfficePdfFile(chooseOptions)
完整页面内会脱敏后记录诊断,不建议在客户生产日志中直接打印未脱敏路径。输入原件不被修改,选文件返回的沙盒副本及成功PDF由业务按实际生命周期管理。卸载应用会删除应用沙盒。
uni-app(Vue 3):使用 JavaScript 调用
已注册 .vue 页面的脚本中只导入业务 API,不使用 UTS 类型注解;按钮调用 chooseAndConvert()。下方函数可放在 <script setup> 中,带忙碌状态、取消和日志的完整页面为 uni_modules/lizhao-office-pdf/example/uniapp/index.vue。
import { chooseOfficePdfFile, convertOfficeToPdf, openOfficePdfPreview } from '@/uni_modules/lizhao-office-pdf'
function chooseAndConvert() {
chooseOfficePdfFile({
success: (selected) => {
convertOfficeToPdf({
source: { kind: 'local-file', uri: selected.localPath },
format: selected.format,
timeoutMs: 120000,
success: (result) => {
openOfficePdfPreview({
filePath: result.outputPath,
fail: (error) => {
console.error('打开失败,已生成的 PDF 仍然保留', error.errMsg)
}
})
},
fail: (error) => {
console.error('转换失败', error.errSubject, error.errCode, error.reason, error.nativeCode)
},
complete: (result) => { console.log('转换结束', result.taskId, result.success) }
})
},
fail: (error) => { console.error('选择失败或取消', error.errCode, error.reason) }
})
}
模块二:查询能力、取消及诊断
const capabilities = getOfficePdfCapabilitiesSync()
console.log('内核状态', capabilities.status, capabilities.abi, capabilities.nativeCode)
// pending表示尚待后台/首次转换校验,可以调用转换;unavailable须按nativeCode处理。
// 保存convertOfficeToPdf实际返回的编号,不使用示意编号取消其他任务。
function requestCancel(taskId: string): void {
const receipt = cancelOfficePdfTask(taskId)
console.log('取消请求回执', receipt.accepted, receipt.state, receipt.executionState)
// accepted不等于资源已经退出,仍等待原转换的fail/complete。
}
const diagnostics = getOfficePdfDiagnosticsSync()
console.log('脱敏诊断', diagnostics.stage, diagnostics.executionState, diagnostics.droppedLogs)
取消在结果提交前被接受,立即禁止该任务再发布成功;真实退出在deadline前完成则为CANCELLED,deadline先到则为TIMEOUT并记录cancelRequested和draining。晚结束仅清理,不二次回调。已交付结果后取消不被接受,也不删除结果。
没有活动转换时无需调用取消。页面销毁时可请求取消本页保存的任务编号,仍需尊重原生释放状态。首期仅一个活动转换任务,无隐藏等待队列;第二个任务返回BUSY,不中断第一个任务。
模块三:Android 连续预览与内置样本
转换成功后的 outputPath 可传给 openOfficePdfPreview。阅读器与体验 APK 使用同源的 Android PdfRenderer 连续列表,支持滑动翻页、页码跳转、缩放后的横向查看和轻触显示工具栏。关闭阅读器保留 PDF;无需外部阅读应用,不为预览申请存储权限。
function previewConvertedPdf(outputPath: string): void {
const options: OpenOfficePdfPreviewOptions = {
filePath: outputPath,
success: (result) => { console.log('阅读器已初始化', result.taskId, result.pageCount, result.fileSize) },
fail: (error) => { console.error('预览失败,PDF仍保留', error.errCode, error.nativeCode, error.errMsg) },
complete: (result) => { console.log('打开预览回调结束', result.taskId, result.success) }
}
openOfficePdfPreview(options)
}
success 表示文件已被真实解析且阅读器可以显示,并不表示所有页面已逐页渲染或排版验收。初始化时退出会返回真实取消;打开成功后关闭不会再次触发终态回调。仅接受插件结果目录中的已生成 PDF,不用于任意外部文件。iOS、Harmony、Web 和小程序调用此原生预览 API 返回 9347002 / UNSUPPORTED_PLATFORM。
两宿主示例的“Word 示例”使用随插件交付的 uni_modules/lizhao-office-pdf/static/reference-docx.docx,真实传入 source.kind='app-resource' 和资源路径 /uni_modules/lizhao-office-pdf/static/reference-docx.docx;文件大小由生成器读取实际字节,不用预置 PDF 冒充转换。实际 API 调用及失败处理见上述两份完整示例页面。
API 用途速查
| API | 用途 | 返回 |
|---|---|---|
chooseOfficePdfFile(options) |
系统选择并流式复制一份Office文件到沙盒 | 选取任务ID,终态回调 |
convertOfficeToPdf(options) |
本地Office转PDF | 转换任务ID,进度和终态回调 |
openOfficePdfPreview(options) |
Android 内置连续阅读器打开已生成 PDF | 预览任务ID,打开成功/失败及complete |
cancelOfficePdfTask(taskId) |
请求取消指定任务 | accepted、state、executionState |
getOfficePdfCapabilitiesSync() |
轻量能力与实际可用性查询 | OfficePdfCapabilities |
getOfficePdfDiagnosticsSync() |
脱敏、有界的原生诊断快照 | OfficePdfDiagnostics |
转换参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| source | OfficePdfSource | 是 | 本地输入对象,包含kind与uri | 无 | local-file、content-uri、app-resource |
| source.kind | string | 是 | 来源类型,content-uri须有有效系统授权;app-resource须为宿主可读取的本地资源路径 | 无 | local-file、content-uri、app-resource |
| source.uri | string | 是 | 本地路径或真实授权content URI,不接受http/https | 无 | 最长4096字符,不含NUL |
| format | string | 否 | 格式提示,原生仍核对文件头/容器/实际类型 | 自动识别 | doc、docx、ppt、pptx |
| timeoutMs | number | 否 | 包含准备至提交的总deadline,单位毫秒 | 120000 | 1000–600000的整数 |
| maxInputBytes | number | 否 | 输入字节上限,只能在硬边界内设置 | 52428800 | 1–134217728的整数 |
| onProgress | function | 否 | 真实taskId、stage、elapsedMs,无假百分比 | 无 | preparing/converting/validating/saving等真实阶段 |
| success | function | 否 | 结果完整校验并持久保存后一次回调 | 无 | OfficePdfResult |
| fail | function | 否 | 可识别错误,保留原生释放状态 | 无 | OfficePdfFail |
| complete | function | 否 | 终态后至多一次,与success/fail使用同一结果引用 | 无 | OfficePdfComplete |
选择、取消和查询
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| choose.success | function | 否 | 返回taskId、localPath、fileName、format、fileSize(字节) | 无 | OfficePdfPickedFile |
| choose.fail | function | 否 | 取消选择、忙碌、不可读、过限等真实错误 | 无 | OfficePdfFail |
| choose.complete | function | 否 | 返回taskId、success、result或error | 无 | ChooseOfficePdfFileComplete |
| cancel.taskId | string | 是 | 原转换返回的任务ID | 无 | 不接受任意目录/文件路径 |
同步查询没有参数,不读取大文件或同步初始化重型引擎。能力状态区分pending、ready、unavailable;包含formats、ABI、引擎版本/构建ID、实际限额、supportsHardCancel及限制说明。installed不能当作转换成功。
原生预览参数与结果
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| filePath | string | 是 | 直接使用转换成功的 outputPath;只读打开应用私有结果 PDF,不接受网络地址或其他目录 | 无 | 非空、最长4096字符、无控制字符 |
| success | function | 否 | 返回 OfficePdfPreviewResult:taskId、fileSize(字节)、pageCount;阅读器已初始化且可显示 | 无 | 打开成功至多一次 |
| fail | function | 否 | OfficePdfFail,包含 previewing 阶段、原生原因和脱敏诊断 | 无 | 不可读、无效PDF、忙碌、取消、打开超时、不支持平台等 |
| complete | function | 否 | OfficePdfPreviewComplete:taskId、success、result、error;失败时 result=null,成功时 error=null | 无 | 与对应 success/fail 共用本次终态 |
预览有独立的活动阅读器限制和打开超时;并发再开返回 9347010 / BUSY,初始化等待超过期限返回 9347012 / TIMEOUT。页渲染使用单后台队列及有界缓存,关闭时串行释放;关闭已打开阅读器不取消转换或删除结果。预览诊断合入 getOfficePdfDiagnosticsSync().records,自身日志丢弃量在预览摘要中单独说明,不覆盖转换快照的状态及计数。
结果、进度与错误对象
成功对象字段:taskId、outputPath(沙盒绝对路径)、fileSize(字节)、pageCount、durationMs、sourceFormat、engine、engineVersion、warnings。结果位于应用私有持久目录中的每任务独立PDF,不覆盖原件;打开失败不改变转换已成功的结果。对外分享需业务使用正式系统分享能力和临时授权,不能把私有绝对路径或file URI直接交其他应用。
OfficePdfComplete字段为taskId、success、result、error;失败时result为null,成功时error为null。OfficePdfFail包含errSubject、errCode、errMsg、reason、taskId、stage、nativeCode、cancelRequested、executionState与脱敏diagnostics。原生执行状态可为running、draining、released、unknown;终态回调不自动表示资源已释放。
进度通过本任务onProgress订阅,不建立全局持续监听;任务终态或释放后不再发送本任务进度。诊断缓存有条数与体积上限,droppedLogs标明丢弃,报告不默认上传。
错误码说明
统一 errSubject=lizhao-office-pdf。以下错误码与reason跨宿主一致,原生原因保留在nativeCode与脱敏diagnostics中。
| 错误码 | reason | 含义与处理建议 |
|---|---|---|
| 9347001 | INVALID_ARGUMENT | 参数或数据源不合法,核对本地URI及整数限额 |
| 9347002 | UNSUPPORTED_PLATFORM | 当前 Harmony / Web / 小程序等端不支持;原生连续预览仅 Android。iOS 转换缺少可用内核时返回 9347008 |
| 9347003 | UNSUPPORTED_FORMAT | 首期仅四种Office格式,不改后缀伪装 |
| 9347004 | SOURCE_UNREADABLE | 文件/授权不可读,重新选择或准备合法沙盒文件 |
| 9347005 | TYPE_MISMATCH | 提示格式、后缀和内容不一致,提供真实文档 |
| 9347006 | PASSWORD_REQUIRED | 首期不处理密码文档,请业务先合法解密 |
| 9347007 | CORRUPT_DOCUMENT | 文档或容器损坏,先由原办公软件检查 |
| 9347008 | ENGINE_UNAVAILABLE | 检查AAR、ABI、策略门禁及基座是否匹配 |
| 9347009 | LIMIT_EXCEEDED | 文件/容器/输出超过安全预算,缩小文档 |
| 9347010 | BUSY | 已有任务未释放,等待真实退出后再试 |
| 9347011 | CANCELLED | 取消后任务已停止,无新可交付结果 |
| 9347012 | TIMEOUT | 总deadline已到,核对executionState,不假定资源已退出 |
| 9347013 | OUTPUT_INVALID | PDF未通过真实校验,不把部分文件当成功 |
| 9347014 | NO_SPACE | 磁盘预算不足,业务释放自身不再需要的资源后重试 |
| 9347015 | RESOURCE_RELEASE_UNCONFIRMED | 资源退出未知,保留槽并查看完整报告,不立即重复转换 |
| 9347016 | NATIVE_FAILURE | 未分类原生失败,复制完整脱敏报告排查 |
| 9347017 | EXTERNAL_CONTENT | 已拒绝外部资源或不允许的外部关系;普通网页点击链接的处理见注意事项,不联网补齐文档 |
| 9347018 | LICENSE_INVALID | 选定引擎授权无效,按真实引擎和分发范围处理 |
失败不会静默切换到服务器。取消接受与完成不是同一时刻;释放状态未知时不能承诺文件已清理,超时后也不会再派发成功。客户回调抛异常不改变已固定的业务终态,complete仍按单次合同派发。
当 nativeCode=FD_INSPECTION_INCOMPLETE 时,表示内核未完成自身文件描述符的安全检查,不能仅凭此错误判断缺少外部存储权限。系统文件选择器通过用户选中文件授予读取权限,无需申请全盘存储读写权限。排查时请从示例底部“一键复制日志”取得完整报告,并提供设备型号和 Android 版本;错误回执优先保留当前任务的门禁检查摘要,完整快照仍可通过 getOfficePdfDiagnosticsSync 获取。具体失败操作、errno 和线程检查信息用于区分系统限制、检查竞态等原因,不应关闭门禁或盲目重试。
部分系统允许识别进程中的 socket,却拒绝读取其类型。内核只在符合该特定拒绝条件时尝试封锁这些 socket 的后续 I/O,并在所有线程上再次核验;封锁或复查失败仍返回真实错误,不把未知 socket 当成本地 socket。诊断中的 quarantine.installed、quarantine.rechecked、quarantine.tsyncRc、quarantine.errno 用于核对这一步。错误回执有长度上限,辅助计数可能只出现在完整快照中;排查时请保留完整报告,不能仅凭短摘要缺少字段判断没有执行检查。
注意事项
平台与基座
| 宿主 / 平台 | 支持情况 | 条件与验收边界 |
|---|---|---|
uni-app,Android,Vue 3 .vue |
已提供实现及示例 | API 24+、ARM64;保留记录有资源导出 / Kotlin 联编,完整新基座业务待验 |
| uni-app x,Android,Vapor | 已提供实现及示例 | API 24+、ARM64;配对项目采用 Vapor,有资源导出 / libVapor 联编记录,完整新基座业务待验 |
| uni-app x,Android,标准 VDOM | 待独立宿主验收 | 已有单文件转换检查,不将其等同标准模式完整工程编译或运行通过 |
uni-app,Android,Vue 2 .vue |
通用选项式示例已提供,原生宿主待验 | 与 Vue 3 共用示例,脚本/模板兼容检查不替代 Vue 2 原生联编和真机验收 |
uni-app .nvue |
未验证 | 不承诺当前页面在此渲染组合已兼容 |
| Android ARM32 / x86 / x86_64 | 不支持 | 内核仅包含 arm64-v8a,不能只改配置获得其他 ABI |
| Android 最低系统 / 16KB 页设备 | 需专项验收 | minSdk 为 API 24,不表示最低系统和 16KB 设备均已实测 |
| iOS | 未提供首版支持(移植源码) | 已有 Swift / UTS 接口及 LibreOfficeKit 适配源;缺少 Apple 内核制品与严格离线保护,转换返回 9347008 / ENGINE_UNAVAILABLE,不能用于生产 |
| Harmony / HarmonyOS | 不支持 | 尚无转换实现 |
| Web / H5 | 不支持 | 不提供浏览器端 Office 转 PDF |
| 微信、支付宝及其他小程序 | 不支持 | 不提供小程序转换实现 |
| uniCloud / 其他服务器 | 不提供云端转换 | 纯客户端能力,没有云函数、云服务或联网回退 |
uni_modules/lizhao-office-pdf/package.json 中 y 表示提供对应实现,- 表示未验证 / 不在本插件能力范围,x 表示不支持。Android 支持声明不等于每个系统版本、渲染模式与客户文件都已经验收。Harmony / Web / 小程序等端的转换 / 选择接口通过失败回调返回 9347002 / UNSUPPORTED_PLATFORM。iOS 已增加系统文件选择及五 API 适配源码,但内核尚未交付;转换返回 9347008 / ENGINE_UNAVAILABLE,能力查询 available=false。iOS 的 - 表示未完成验证,不是支持承诺。移植边界见 uni_modules/lizhao-office-pdf/ios-port.md。
Android 内核由公开 Maven 在构建期自动取得,AAR 大小为 55,717,586 字节。主体库使用无损 XZ 压缩,保留原本的四格式能力、字体及资源;首次使用需要在应用私有目录展开约 196 MB 主体库,并进行身份检查,后续复用已校验缓存。包体缩小不表示安装展开、磁盘或内存需求同比降低;需为文档、临时文件和结果另外预留空间。当前仅 ARM64 进程,不自动降级 ARM32 / x86。静态语法或 appResource 成功不表示匹配自定义基座或手机功能已通过。
首次接入以及修改原生源码、依赖、Manifest、权限或资源后,需要重新原生联编或重打Android自定义基座;WGT只更新页面资源,不能更新已编译内核。未安装旧可选内核的Office预览插件可作为组合验证目标,两个离线内核重复装入须显式排除。
转换进程与接入边界
转换服务在本应用的 :office_pdf_kernel 私有进程中运行。宿主的 Application 初始化也可能在该进程执行;请避免在此进程自行启动无关业务、网络 SDK、额外线程任务或同名组件。若宿主 SDK 默认在每个进程初始化,应按其官方配置将该转换进程排除,并在匹配基座中验证。独立原生体验 APK 的结果不能代替这些宿主集成检查。
内核检查在转换 worker 解析文档内容之前执行;主进程已进行有界格式校验。保护依赖可信宿主与启动阶段,不是针对任意恶意宿主的完整系统沙箱,不覆盖通过 Binder / 本地 IPC 委托其他进程联网,也不会撤销检查安装之前已经提交的异步 I/O 或已有映射。被封锁的文件描述符编号会保持封锁直到该 worker 退出,即使后来被关闭或复用也不会解禁;发生运行时不兼容时应回传完整诊断,不关闭保护规则。
已验证范围与 C++ 依赖
保留的开发验收记录显示:Android 10 的 MI 8 ARM64 独立原生验收包完成四格式转换,DOC 1 页、DOCX 3 页、PPT / PPTX 各 2 页;开发样本中文、图片、表格、8 页渲染以及取消、总超时、后续转换和原件 / 已交付结果保护已有验证记录。这些是独立原生包及指定样本的历史结果,完整 uni-app / uni-app x 调用链、系统选文件授权和手机剪贴板仍需匹配新基座验收,不保证客户文档全部同样排版。
压缩内核另在 Redmi K30 Pro / Android 12 / API 31 / ARM64 的并存独立原生包完成四格式冷暖、取消/超时后自然释放、部分解压取消后的精确恢复,以及同机未压缩内核对照的 19 份 PDF 逐页像素/文字/图片/页数核对。该证据针对开发样本,不能替代最低 API 24、16KB 设备、任意客户文件或完整 UTS 宿主验收。
与使用OpenCV的图像插件组合时,需核对 libc++_shared.so。DCloud打包说明列明云端对该文件有默认pickFirst配置;打包成功不能单独证明运行库兼容。本轮使用明确只含单份运行库的两套独立组合包,分别验证四格式转换及OpenCV 4.12.0的真实矩阵、滤波和异常恢复。已验证候选为:
| 运行库来源 | ARM64文件SHA-256 |
|---|---|
| 内核上游附带的C++运行库 | c4c2fe5cbcb1fba0003a31fc7ab29a9bb12df6cc187ec45a806462540e83d93b |
| OpenCV 4.12.0附带的C++运行库 | 4397241b4bd20a8e579bfb41d21107857e12985f6a01ca0c2a5f83380d1270b4 |
维护插件源码的开发者可运行 scripts/check-office-pdf-repository.cjs 核对配置和实际 Gradle 缓存中的内核,再用 scripts/check-office-pdf-native-deps.cjs 检查真实 C++ 条目;追加实际 APK 路径可核对最终 Office 内核及 C++ 唯一条目。仓储尚未解析时检查会明确失败;非默认缓存可用 OFFICE_PDF_KERNEL_AAR 指定真实解析文件,不能把 SDK 拷回插件。普通市场接入用户无需这些工程脚本。其他 SDK、运行库版本、传递依赖和完整宿主运行需要另验,不修改上游库名、不用未经核对的 pickFirst 掩盖冲突。
文件、字体与生命周期
系统选择器仅持有本次授权,成功后将本地副本交给业务;网络、尚未本地可读的云端文件不能作为纯客户端成功证据。应用后台运行受系统限制,首期不提供保活或后台无限执行承诺。
Office字体与布局受本地引擎/字体资源影响,中文、复杂表格、图表、页眉页脚和多页分页须用业务样本逐一核对。静态PDF不保留PPT动画/音视频,图片中的文字不提供OCR。原生禁止宏、活动内容和外部资源加载。DOCX / PPTX 中符合标准的 HTTP / HTTPS 点击超链接会在转换用的私有副本中移除,并通过 warnings 返回移除数量;保留可见文字和内部链接,生成的 PDF 不保留这些外部点击链接,原文件不变。外链图片、模板、危险地址或将超链接冒充资源的文档仍明确拒绝,不下载云端资源补齐内容。损坏/加密/超限输入明确失败。
对于简单固定布局表格中超出单元格可用宽度的嵌入式(inline)图片,插件仅在转换用的私有副本内按可用宽度等比缩小;与这类适配同时命中的纯图片段落,若显式使用大于单倍的自动行距,会调整为单倍行距以减少跨页时漏绘。对于旋转 90° / 270°、未启用真实绘图效果却带有可确认冗余效果占位的图片,仅清除冗余占位,保留图片字节、尺寸和旋转设置。warnings 分别说明实际图片、段落或占位处理数量。复杂或无法确认的布局不自动调整;这些处理不修改原文件,但可能改变图片显示大小、行距和分页,不能保证 PDF 与 Word 逐像素一致或页数相同,请核对实际图片、表格和分页效果。
已返回PDF由业务按保留策略管理,插件不会因下一任务失败自动删除它;应用卸载删除沙盒。需要保存到公开位置或分享时,业务使用系统授权能力,不为转换额外申请无关权限。
隐私、诊断和验收边界
日志不记录客户文档正文、密码、Token或完整个人路径。完整报告包含真实版本/环境/任务关联号和原生快照,无法取得的HX构建版本等写unknown并注明来源;准备电脑版本不能冒充客户包的构建版本。示例底部提供一键复制、固定快照分段与复制失败的手动回退,不清空原日志。
源码静态检查、HX项目编译、原生生成物、独立APK、完整自定义基座以及真机业务验收是不同层次。当前未执行或外部条件不足的项应单独记录;没有客户样本或16KB设备不能宣称这些范围通过。
发行材料
保留 uni_modules/lizhao-office-pdf/licenses/ 中的上游来源、许可证及修改记录。uni_modules/lizhao-office-pdf/licenses/SOURCE-STATUS.json 如实记录尚未补齐的完整第三方NOTICE和客户源码获取渠道;当前源码候选可用于开发基座验收,商业发行前仍须完成这些材料及相应发布检查,不能把开发样本通过当成发行就绪。
作者系列 UTS 插件
以下为作者已发布的 UTS 插件,可按能力方向查找。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-alipay-kit |
支付宝授权登录、App 支付与脱敏诊断 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-apple-iap |
苹果内购、交易恢复、订阅管理与服务端验签参考 | 查看插件 |
lizhao-apple-login |
苹果授权登录、凭证状态与撤销监听 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-camera-pro |
原生相机、拍照录像、水印与媒体保存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-dingtalk |
钉钉授权登录、内容分享与回执诊断 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-douyin-kit |
抖音授权登录、内容分享与回执诊断 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-google-login |
Google 授权登录、会话管理与脱敏诊断 | 查看插件 |
lizhao-hce-card |
NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 | 查看插件 |
lizhao-health |
健康数据授权、查询、统计与写入 | 查看插件 |
lizhao-http-server |
本地 HTTP 服务、文件传输与实时通信 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-id-photo |
证件照制作、尺寸换算、换底色与模板换装 | 查看插件 |
lizhao-img-eraser |
图片去水印、局部修复与原生编辑器 | 查看插件 |
lizhao-live-activity |
实时活动、系统胶囊与普通通知降级 | 查看插件 |
lizhao-live-photo |
实况照片选取、展示预览与原件处理 | 查看插件 |
lizhao-map |
高德地图、定位、地点搜索、路线规划与导航 | 查看插件 |
lizhao-meta |
Facebook 登录分享、应用事件与深链 | 查看插件 |
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-notify-pro |
本地通知、点击动作、进度与定时提醒 | 查看插件 |
lizhao-novel-reader |
原生小说阅读、仿真翻页与段落评论 | 查看插件 |
lizhao-office-view |
Office 与 PDF 文件预览、进度与缓存管理 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-play-billing |
Google Play 商品购买、订阅、恢复与确认消耗 | 查看插件 |
lizhao-qq-share |
QQ 授权码登录、QQ 与 QQ 空间分享 | 查看插件 |
lizhao-qrcode |
二维码生成、Logo 与样式配置、批量生成及导出 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-tcp-pro |
TCP 客户端、服务端、多连接与诊断 | 查看插件 |
lizhao-usb-storage |
U 盘、移动硬盘文件浏览、读写与批量复制 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-video-feed |
短视频上下滑、短剧选集与分页加载 | 查看插件 |
lizhao-video-player |
原生视频播放器、清晰度与播放交互 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |
lizhao-wecom |
企业微信授权登录、内容分享与脱敏诊断 | 查看插件 |
lizhao-xhs-share |
小红书图文视频分享与回执诊断 | 查看插件 |

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