App端<web-view>直接加载PDF常失败,因不支持本地路径、跨域URL及data:协议;pdf.js需在独立HTML页中运行,依赖worker和canvas,而WKWebView受限;应下载PDF至本地再通过file://协议由pdf.js渲染。

App端直接用<web-view>打开PDF为什么经常失败
因为uni-app的App端(iOS/Android)中,<web-view>默认不支持直接加载本地PDF文件路径(如__UNI__xxx.pdf),也不支持跨域的PDF URL(比如后端直传的带token的私有链接)。更关键的是:iOS WKWebView对data:协议的PDF base64渲染极不稳定,常显示空白或报错Failed to load PDF document。
实操建议:
- 避免用
src直接绑定file://或__APP__/路径——App端无法识别这些协议 - 不要把PDF转成base64塞进
data:application/pdf;base64,...再喂给<web-view>——iOS大概率白屏 - 若PDF来自网络,确保服务端已配置
Access-Control-Allow-Origin: *(仅调试用),且响应头含Content-Type: application/pdf - 真正可行的兜底路径是:先用
uni.downloadFile把PDF存到uni.env.USER_DATA_PATH,再用plus.io.resolveLocalFileSystemURL转成_www可读路径,最后喂给<web-view>
为什么不能直接在Vue页面里用pdf.js渲染PDF
pdf.js核心依赖Worker和canvas,而uni-app的App端(尤其iOS)运行环境是WKWebView,它不支持new Worker(),且部分Canvas API受限。直接引入pdfjs-dist/build/pdf.min.js会报ReferenceError: Worker is not defined或渲染异常。
实操建议:
- 放弃在Vue页面中直接调用
pdfjsLib.getDocument——这不是浏览器环境 - pdf.js必须运行在
<web-view>加载的独立HTML页中(该页由你托管,可完整控制JS执行环境) - 这个HTML页要自己引入pdf.js(推荐CDN:
https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.min.js),并手动初始化PDFJS.workerSrc指向同源worker文件(否则iOS报错) - worker文件需单独下载并放至H5打包目录(如
static/pdfjs/pdf.worker.min.js),然后在HTML里写:PDFJS.workerSrc = '/static/pdfjs/pdf.worker.min.js';
如何让pdf.js在App端<web-view>中稳定加载本地PDF
核心思路:把PDF文件先保存为本地绝对路径,再通过web-view加载一个“中间页”,由该页用pdf.js加载本地文件(利用file://协议)。
实操步骤:
- 用
uni.downloadFile下载PDF到uni.env.USER_DATA_PATH + '/temp.pdf' - 调用
plus.io.resolveLocalFileSystemURL将本地路径转为file:///var/mobile/Containers/Data/Application/xxx/Documents/temp.pdf格式(注意iOS路径前缀是file://,Android是file:///) - 构造一个本地HTML页(如
static/pdf-viewer.html),里面用PDFJS.getDocument('file://...')加载,并处理渲染逻辑 <web-view :src="'/static/pdf-viewer.html?pdf=' + encodeURIComponent(filePath)"></web-view>- 注意:iOS要求PDF路径必须是
file://开头且文件真实存在;Android则需加file:///三斜杠,且权限已申请READ_EXTERNAL_STORAGE
pdf.js在App端常见报错及修复点
不是代码写错了,而是环境约束没满足。以下错误基本都对应明确解法:
-
PDFViewerApplication is not defined→ 你用了pdf.js的完整viewer(viewer.html),但没配好viewer.js和locale路径;建议弃用viewer,手写轻量渲染逻辑 -
Cannot read property 'textContent' of null→ 页面DOM未就绪就调用renderPage;确保document.getElementById('pdf-canvas')存在后再执行 - 滑动卡顿、缩放失灵 → 关闭pdf.js的
useOnlyCssZoom: true(默认false),改用setZoom配合scale手动控制 - iOS白屏但控制台无报错 → 检查
pdf-viewer.html是否被uni-app的H5构建过程压缩出错;尝试关闭vite.build.sourcemap或改用pdfjs-dist/es5/build/pdf.min.js
最易被忽略的一点:pdf.js版本别用3.x(目前仍处于beta),2.16.x是App端兼容性最好的稳定版。新项目也别图省事用npm install pdfjs-dist——直接下zip包取build目录里的文件更可控。


















