更新记录

1.0.0(2026-10-03)

  • 首次发布:uni-app x 标准模式 PDF 预览组件(蒸汽模式,Android,基于 MuPDF)
    • 打开本地 / file:// / http(s) 远程 PDF,支持加密文档密码
    • 适配宽度 / 整页适配双模式,手势滑动与点击翻页、双指捏合与 API 缩放
    • 回调式 API(open / close / goToPage / nextPage / prevPage / zoomIn / zoomOut / setFitMode)
    • 事件:load / pageChange / rendered / error,错误码 9030001 ~ 9030009

平台兼容性

uni-app x(4.36)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
- - 5.0 1.0.0 - - -

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × × √

zy-pdf-viewer

PDF 阅读器 uni-app x 标准模式组件(支持蒸汽模式)(uts-vue-component),基于 MuPDF(com.artifex.mupdf:fitz)实现。

  • 仅实现 Android(iOS / HarmonyOS 未提供)
  • 单页阅读模式:适配宽度 / 整页适配,滑动与点击翻页、双指缩放

功能

  • 打开本地绝对路径、file://、http(s) 远程 PDF,支持加密文档密码
  • 适配宽度(默认)/ 整页适配两种模式,可动态切换
  • 翻页:左右滑动、点击屏幕两侧、goToPage / nextPage / prevPage
  • 缩放:双指捏合、zoomIn / zoomOut
  • 放大后单指平移(横向、纵向均可),到页边继续滑动自动翻页
  • 页码与状态事件:load / pageChange / rendered / error
  • 方法采用回调式 API(success / fail),同时通过事件回传

快速开始

easycom 规范,无需 import 即可直接使用:

<template>
    <view class="page">
        <zy-pdf-viewer ref="pdfRef" class="pdf" :src="src" @load="onLoad"
            @pageChange="onPageChange" @rendered="onRendered" @error="onError"></zy-pdf-viewer>
        <button @click="next">下一页</button>
    </view>
</template>

<script setup lang="uts">
    const pdfRef = ref<ComponentPublicInstance | null>(null)
    const src = ref<string>("https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf")

    function onLoad(pageCount: number) {
        console.log("已打开,共 " + pageCount + " 页")
    }

    function onPageChange(page: number, pageCount: number) {
        console.log("第 " + page + " / " + pageCount + " 页")
    }

    function onRendered(page: number, pageCount: number) {
        console.log("第 " + page + " 页渲染完成")
    }

    function onError(code: number, message: string) {
        console.log("错误 " + code + " " + message)
    }

    function next() {
        pdfRef.value?.$callMethod('nextPage', {
            success: (result) => {
                console.log(result.msg + " 当前第 " + result.data["page"] + " 页")
            },
            fail: (error) => {
                console.log(error.code + " " + error.message)
            }
        })
    }
</script>

<style>
    .pdf {
        width: 100%;
        flex: 1;
        min-height: 200px;
    }
</style>

组件根节点是 <native-view>,必须设置明确的宽高(常用 width: 100% + flex: 1 撑满父容器,或固定 height)。

调用说明

  • 组件已通过 defineExpose 显式暴露全部方法,vapor 模式下使用 $callMethod('方法名', options) 调用。
  • success / fail 每次调用最多触发一次,回调在主线程派发。
  • 各方法的回调触发时机:
方法 success 触发时机
open 文档加载完成(@load 触发时),data = { page, pageCount }
close 调用后立即返回(同步成功)
goToPage / nextPage / prevPage 页码切换完成(@pageChange 触发时),data = { page, pageCount }
zoomIn / zoomOut / setFitMode 重新渲染完成(@rendered 触发时),data = { page, pageCount }
任意方法 出错时触发 fail,同时派发 @error 事件
  • getPageCount / getCurrentPage 为同步查询方法,直接返回数字(未打开时返回 0),无回调。
  • src 变化(绑定响应式数据或再次 open)会自动重新打开文档。

手势交互

手势 行为
单指拖动 平移视图(适配宽度模式下可横向 / 纵向平移)
单指横向快速滑动 适配宽度且内容未横向溢出时,直接翻到上 / 下一页
点击屏幕左 1/3 回上一页(当前页已滚动时先回到页首)
点击屏幕右 1/3 翻下一页(当前页未滚动到底时先滚动到底)
双指捏合 缩放(受渲染像素预算限制,超大页面自动限制最大缩放)

Props

属性 类型 默认值 说明
src string "" PDF 地址:本地绝对路径、file:// 路径或 http(s) 远程地址;绑定后自动打开
password string "" 文档密码,加密 PDF 时传入
fitMode string "width" 适配模式:width 适配宽度,page 整页适配
startPage number 1 起始页码,从 1 开始

API

方法

所有异步方法的 success 收到 PdfResult { code, msg, data },fail 收到 PdfError { code, message }。

方法 入参 Options 说明
open OpenPdfOptions 打开文档(src 必填,其余覆盖同名 Prop)
close PdfCallbackOptions 关闭当前文档,释放页面资源
goToPage GoToPageOptions 跳转到指定页(page 从 1 开始,越界回传 9030006)
nextPage PdfCallbackOptions 翻到下一页(末页无操作,仍回调成功)
prevPage PdfCallbackOptions 翻到上一页(首页无操作,仍回调成功)
zoomIn PdfCallbackOptions 放大一档
zoomOut PdfCallbackOptions 缩小一档
setFitMode PdfCallbackOptions 的扩展 切换适配模式,第一个参数为 mode: string("width" / "page")
getPageCount 无 同步返回总页数,未打开时为 0
getCurrentPage 无 同步返回当前页码,从 1 开始,未打开时为 0

类型定义见 utssdk/interface.uts。

Options 类型

类型 字段 说明
PdfCallbackOptions success?: (result: PdfResult) => void 成功回调,result = { code, msg, data }
fail?: (error: PdfError) => void 失败回调,error = { code, message }
OpenPdfOptions src: string PDF 地址(必填)
password?: string 文档密码
startPage?: number 起始页码,默认 1
fitMode?: string width(默认)或 page
success? / fail? 同上
GoToPageOptions page: number 目标页码,从 1 开始(必填)
success? / fail? 同上

事件

事件 回调参数 说明
@load (pageCount: number) 文档加载完成
@pageChange (page: number, pageCount: number) 当前页码变化(手势或 API 翻页均触发)
@rendered (page: number, pageCount: number) 当前页渲染完成(打开、翻页、缩放后触发)
@error (code: number, message: string) 出错,code 见错误码表

错误码

错误码 含义
9030001 文件不存在或无法访问 / src 为空
9030002 打开文档失败
9030003 文档需要密码或密码错误
9030004 渲染页面失败
9030005 下载文档失败
9030006 页码无效
9030007 当前平台不支持
9030008 组件已销毁
9030009 文档未打开

注意事项

  • 组件根为 <native-view>,需自身具备宽高;背景、边框、圆角等装饰样式建议写在外层 <view> 上,不要依赖组件根节点。
  • 渲染带有像素预算保护(约 80MB 位图 + 100MB 画布上限),超大页面会自动限制最大缩放倍数,避免 Canvas: trying to draw too large bitmap 崩溃。
  • 远程 PDF 会先下载到应用缓存目录再打开,失败回传 9030005。
  • 页面切换时若页码已到边界(首页 / 末页),翻页方法不产生变化但仍然回调成功。
  • 组件在 onUnmounted 时自动释放原生资源,页面卸载前无需手动销毁。

目录结构

zy-pdf-viewer/
├── components/zy-pdf-viewer/zy-pdf-viewer.uvue   # easycom 组件(方法转发 + defineExpose)
├── utssdk/
│   ├── interface.uts                             # 类型定义(Options / PdfResult / PdfError)
│   ├── unierror.uts                              # 错误码定义(9030001 ~ 9030009)
│   └── app-android/
│       ├── index.uts                             # PdfViewer:回调管理 + 事件桥接
│       ├── PdfPageView.kt                        # 原生渲染与手势(MuPDF)
│       └── config.json                           # MuPDF maven 依赖与仓库声明
├── changelog.md
└── readme.md

参考

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。