uni.opendocument在app端常因路径不合法失败,仅支持res.tempfilepath和/static/xxx.pdf两类路径,http链接、file://协议、base64均不支持;安卓需带.pdf后缀,ios须严格使用res.tempfilepath,且必须校验res.statuscode===200。

uni.openDocument 为什么在App端经常失败
直接调用 uni.openDocument 打不开 PDF,90% 是因为路径不合法或平台特性被忽略。它只认两类路径:res.tempFilePath(下载临时路径)和 /static/xxx.pdf(包内绝对路径),HTTP 链接、file:// 协议、base64 字符串全都不支持。
常见错误现象包括:安卓静默失败无提示、iOS 报 “无法打开文件”、部分机型提示“不支持该格式”。根本原因不是 API 本身有问题,而是传入的 filePath 没通过平台校验。
- 安卓必须带
.pdf后缀,否则系统识别失败(哪怕文件内容正确) - iOS 必须严格使用
res.tempFilePath,不能用res.filePath或拼接字符串 - 下载前务必检查
res.statusCode === 200,否则可能把 404 响应体当 PDF 保存并尝试打开 - 某些安卓机型(尤其华为旧版 EMUI)需要手动赋予存储权限,否则
tempFilePath写入失败
下载后用 plus.runtime.openFile 打开本地文件
当 uni.openDocument 不稳定或需绕过系统限制时,plus.runtime.openFile 是更底层、更可控的选择。它不依赖 uni-app 封装层,直接调用原生运行时能力,对路径宽容度更高,也支持自定义打开方式(如强制用 WPS)。
关键点在于路径转换:必须用 plus.io.convertLocalFileSystemURL(filePath) 把 uni-app 的路径转为原生可识别格式,否则会报错 fail file not found。
- 推荐将文件持久化到
uni.env.USER_DATA_PATH,避免tempFilePath被系统自动清理 - 打开失败时回调里建议弹 Toast 提示用户安装 PDF 阅读器,而不是只 console.error
- 注意 iOS 上此 API 仅支持打开,不支持指定应用;安卓可配合
intent参数强制指定包名(如com.kingsoft.wpsoffice)
web-view 加载本地 viewer.html 实现嵌入式预览
想在 App 内嵌一个带缩放、翻页、搜索的 PDF 查看器,又不想自己写 Canvas 渲染逻辑?web-view + 本地 pdf.js 是最省事的方案。它本质是启动一个微型浏览器环境,复用系统 WebView 渲染能力,不依赖外部网络,也不需要用户安装额外应用。
核心难点不在代码,而在资源组织和路径拼接:viewer.html?file= 后面必须是能被 web-view 正确加载的本地路径,且需做 encodeURIComponent 处理特殊字符。
- PDF 文件必须放在
/hybrid/或/static/目录下,确保编译后仍可被 web-view 访问 -
viewer.html需要提前修改默认配置,禁用远程 worker 加载(否则 H5 环境会跨域失败) - Android 端重复打开大文件时存在内存泄漏风险,务必在页面
onUnload中调用web-view的remove方法释放实例 - iOS 上若 PDF 有加密或字体缺失,可能渲染异常,建议服务端提前做兼容性处理(如嵌入字体、降级为 PDF/A)
pdf.js 自定义渲染:什么时候值得自己画 Canvas
只有当你需要完全掌控 PDF 渲染过程时,才该选这条路——比如添加水印、高亮关键词、截取某几页、支持文本选择或导出图片。它不走系统预览通道,而是用 pdfjsLib.getDocument() 解析二进制流,再逐页 render() 到 <canvas></canvas> 上。
代价很明确:包体积增加约 1.2MB(min 版本),首屏加载慢,滚动卡顿明显(尤其长文档),且 iOS Canvas 绘制性能远低于 Android。
- 务必用
workerSrc指向本地pdf.worker.min.js,禁用 CDN 加载,否则离线失效 - 不要一次性渲染全部页面,用懒加载 + 页面缓存(如 LRU)控制内存占用
- 遇到
InvalidPDFException错误,大概率是后端返回了非标准 PDF 流(如加了 BOM 头、gzip 未解压),需先做二进制清洗 - 文本选择功能需配合
getTextContent()和 DOM 定位,iOS 上点击区域偏移常见,需按设备像素比修正坐标
真正难的从来不是“怎么打开”,而是“打开后用户能不能顺利看完”。路径校验、文件持久化、内存释放、字体兼容——这些细节不处理,再漂亮的 UI 也会在真机上崩给你看。











