更新记录

0.6.10(2026-08-23)

  • 该插件使用AI - gpt5.6开发,测试了IOS 安卓 鸿蒙 均正常。
  • PDF 生成新增 logo 插入能力,支持 top-lefttop-centertop-rightcenterbottom-leftbottom-centerbottom-rightcustom 定位,并支持 first / all 页面范围。
  • 图片块与 Logo 统一支持本地路径、file://unifile:// 以及 HTTP(S)/FTP 远程地址,生成前会先下载到临时文件再排版。
  • 首页工作台导出默认在首页 PDF 右上角插入品牌 Logo。

平台兼容性

uni-app x(5.23)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 7.1 18 6 -

其他

多语言 暗黑模式 宽屏模式
× ×

simple-pdf

simple-pdf 是面向 uni-app x Vapor 的独立 PDF 插件,包含结构化 PDF 生成、文件保存、系统查看器和页面内原生预览

原生嵌入式预览

<simple-pdf-view> 会直接嵌入当前页面:Android 使用系统 PdfRenderer,iOS 使用系统 PDFKit,HarmonyOS 使用系统 @kit.PDFKit。组件必须设置明确高度。

<simple-pdf-view
  ref="pdfView"
  :src="pdfPath"
  :page="0"
  :swipe-horizontal="false"
  :show-scroll="true"
  style="width: 100%; height: 560px;"
  @load="onPdfLoad"
  @fail="onPdfFail"
  @pageChanged="onPdfPageChanged"
/>
属性 类型 默认值 说明
src string '' 本地、unifile:// 或 HTTP(S) PDF 地址
page number 0 初始页索引,从 0 开始
swipeHorizontal boolean false 横向翻页模式
password string '' 加密 PDF 密码
showScroll boolean true HarmonyOS 滚动条显示开关
spacing number 0 HarmonyOS 页面间距

组件事件包括 loadfailpageChanged。组件实例暴露 renderjumpTonextPageprevPagegetPageSizedestroy

Android 的系统 PdfRenderer 不提供密码解密接口,因此 Android 遇到加密 PDF 会触发 fail;iOS 与 HarmonyOS 支持通过 password 打开加密文档。

生成 PDF

import { createPdf } from '@/uni_modules/simple-pdf'

const result = await createPdf({
  fileName: 'expense-report.pdf',
  title: '支出统计',
  logo: {
    imagePath: '/static/logo.png',
    anchor: 'top-right',
    pages: 'first',
    width: 40,
    height: 40,
    fit: 'contain'
  },
  blocks: [
    {
      type: 'statCards',
      columnCount: 3,
      cards: [
        { label: '记录总金额(元)', value: '1680.00' },
        { label: '有效金额(元)', value: '1280.00', tone: 'success' },
        { label: '作废金额(元)', value: '400.00', tone: 'danger' }
      ]
    },
    { type: 'table', columns: ['类型', '金额'], rows: [['采购', '1280.00']] }
  ]
})

支持 titleparagraphkeyValuestatCardstablechartimagespacerlogologo 默认显示在首页右上角;logo.anchor 支持 top-lefttop-centertop-rightcenterbottom-leftbottom-centerbottom-rightcustomlogo.pages 支持 firstall;自定义位置使用 x / y,角落锚点可额外使用 marginstatCards 支持一至四列卡片和 defaultsuccessdangerinfo 语义色;表格支持自动换行、跨页和跨页重复表头,并可通过 headerBold 控制表头粗细,通过 bodyFontSize 控制正文字号,通过 borderless 输出无边框轻量表格。

原生图表

chart 支持 barprogresslinepiedonut。坐标轴、网格、图例和标签分别通过 showAxesshowGridshowLegendshowLabels 控制。折线图默认不绘制数值为 0 的点,可通过 showZeroValues: true 显式显示 0。

HarmonyOS 端会把单个图表分组先栅格化为一张 PNG 再插入 PDF,避免大量 PDFKit annotation 或 image object 导致主线程冻结。

const chartBlocks: SimplePdfBlock[] = [
  {
    type: 'chart',
    chartType: 'bar',
    text: '月度收支',
    categories: ['1月', '2月', '3月'],
    series: [
      { name: '收入', values: [3200, 4100, 3800], color: '#3491FA' },
      { name: '支出', values: [2100, 2600, 2400], color: '#FF8F1F' }
    ],
    showAxes: true,
    showGrid: true,
    showLegend: true,
    showLabels: true,
    height: 220
  },
  {
    type: 'chart',
    chartType: 'progress',
    text: '课程消耗进度',
    maxValue: 100,
    items: [
      { label: '书法班', value: 82, color: '#3491FA' },
      { label: '阅读班', value: 64, color: '#2BA471' }
    ],
    height: 120
  },
  {
    type: 'chart',
    chartType: 'donut',
    text: '支出构成',
    items: [
      { label: '采购', value: 1280, color: '#3491FA' },
      { label: '维护', value: 680, color: '#2BA471' },
      { label: '其他', value: 320, color: '#FF8F1F' }
    ],
    showLegend: true,
    showLabels: true,
    height: 210
  }
]

柱状图和折线图使用 categories + series;进度条、饼图和环形图使用 items。数值按非负数处理,无数据时输出稳定的空状态。

图片插入

const imageBlock: SimplePdfBlock = {
  type: 'image',
  imagePath: '/static/一页间.png',
  imageFit: 'contain',
  width: 220,
  height: 120,
  align: 'center'
}

图片和 Logo 支持应用资源、本地绝对路径、file://unifile:// 以及 HTTP(S)/FTP 远程地址;远程地址会先下载到临时文件,再交给三端本地解码器处理。contain 保持原始宽高比并完整显示,fill 填满目标区域。推荐使用三端系统解码器稳定支持的 PNG 或 JPEG;路径不存在、文件损坏或格式不受支持时返回 PDF_IMAGE_INVALID

iOS 使用 UIGraphicsPDFRenderer 直接绘制矢量文字和图形,不创建整页位图。Android 和 iOS 原生绘制图表;HarmonyOS 使用 PDFKit,并仅为单个图表区域生成临时 PNG。公共排版最多生成 80 页;超过限制时 createPdf 返回 PDF_PAGE_LIMIT_EXCEEDED,调用方应提示用户缩小数据范围。

批量插入图片(images)

options.images 以数组形式批量插入图片,数组项既可以是图片路径字符串,也可以是携带坐标、尺寸的对象:

const result = await createPdf({
  fileName: 'activity-photos.pdf',
  title: '活动照片',
  pageWidth: 595,
  pageHeight: 842,
  margin: 48,
  images: [
    '/static/photo-1.png',
    { imagePath: '/static/photo-2.png', caption: '书店外景' },
    { imagePath: 'https://example.com/stamp.png', x: 60, y: 60, width: 120, height: 120, page: 0 }
  ]
})

SimplePdfImage 字段语义:

字段 类型 说明
imagePath string 必填。支持应用资源、本地路径、file://unifile:// 及 HTTP(S)/FTP 远程地址
x / y number 同时指定时按坐标自由定位
page number 坐标模式下的目标页索引(0 起始,默认 0)
width / height number 图片显示尺寸;整页模式默认填满页面内容区,坐标模式默认 160×按比例
fit 'contain' / 'fill' 缩放方式,默认 contain
margin number 整页模式下图片距页面边缘的间距,默认使用 options.margin
caption string 整页模式下显示在图片上方的说明文字;坐标模式忽略
  • 数组项是字符串时按整页模式处理,每张图片独立一页并居中。
  • 数组项是对象且同时指定 xy 时按坐标定位到 page 页;目标页不存在时自动补空页。
  • 数组项是对象但未同时指定 xy 时同样按整页模式处理。
  • 远程图片先下载到临时文件再交给三端本地解码器,与 block.type: 'image' 一致;图片无效返回 PDF_IMAGE_INVALID

平台差异

simple-pdf 在三个目标平台复用同一套公共排版(common/builder)和远程资源归一化(common/remote),公开接口保持一致,但底层原生实现和个别能力存在差异:

能力 Android iOS HarmonyOS
PDF 生成 原生绘制矢量文字与图形,文件写入应用缓存目录 UIGraphicsPDFRenderer 矢量绘制,文件写入应用数据目录 @kit.PDFKitrenderPdf.ets)绘制,文件写入应用 filesDir
图表渲染 原生矢量绘制 原生矢量绘制 单个图表分组先栅格化为一张 PNG 再插入 PDF,避免 annotation 过多导致主线程冻结
页面内预览 系统 PdfRenderer,位图渲染 + 自定义滑动翻页 系统 PDFKit PDFView 系统 @kit.PDFKit PdfController
加密 PDF 预览 不支持密码,PdfRenderer 遇加密文档触发 fail 支持 password 解锁 支持 password 解锁
保存文件 savePdf 生成到缓存并返回 path,由调用方自行保存/分享 同 Android,生成到应用目录返回 path savePdf 通过 DocumentViewPicker 让用户选择保存位置,结果回传 outputUri
滚动条 / 页间距 预览为单页位图,忽略 showScroll / spacing PDFView 管理 支持 showScrollspacing
远程资源 图片与远程 PDF 先 uni.downloadFile 下载再交给系统解码 同 Android 同 Android
  • 错误码三端统一为 PDF_PAGE_LIMIT_EXCEEDEDPDF_IMAGE_INVALIDPDF_WRITE_FAILED;HarmonyOS 的 savePdf 额外返回 PDF_SAVE_CANCELLEDPDF_SAVE_FAILED
  • 图片建议使用三端系统解码器稳定支持的 PNG / JPEG,其余格式可能在某平台解码失败并返回 PDF_IMAGE_INVALID
  • 目标平台若包含 Android,请避免依赖加密 PDF 的预览能力。

保存与系统查看器

savePdf(options, callbacks) 生成 PDF 并保存:Android 与 iOS 直接生成到应用目录,将 path 通过回调返回;HarmonyOS 会额外弹出系统 DocumentViewPicker 让用户选择保存位置,并将最终 URI 通过 outputUri 返回。previewPdf(options) 仍然保留,但它只负责调用系统文件查看器,和页面内的 <simple-pdf-view> 是两套明确区分的能力。

隐私、权限声明

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

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

不采集、不上传文档内容

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

暂无用户评论。