更新记录

1.0.0(2026-07-19)

首发:自研 编写高性能 PDF 核心(多图合成 PDF / 文本生成 PDF / 读取页数),经 原生绑定层 生成 Kotlin/Swift 绑定,桥接为 uni-a


平台兼容性

uni-app x(5.14)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 12 × ×

nex-pdf —— 高性能 PDF 生成

自研高性能 PDF 核心(多图合成 PDF / 文本生成 PDF / 读取页数 / 合并 PDF / 拆分 PDF),经原生绑定层提供, 桥接层,把能力暴露成 uni-app 可调的 JS API。仅支持 App 端(Android / iOS),H5 / 小程序加载不了原生库。

同一份 utssdk 插件同时支持 uni-app x(uvue)经典 uni-app(vue3),无需分叉。 全部 路径进 / 路径出:传图片 / 字体 / PDF 文件路径,原生层读写文件 → 生成 → 返回结果,避免大 buffer 跨语言边界 / JS。 底层用自研 的 内置 PDF 生成 + 内置图像编解码 + 内置 PDF 引擎,无系统依赖。

API

JS API 签名 说明
imagesToPdf imagesToPdf(images, dest, pageWidthMm, pageHeightMm, marginMm): PdfResult 多张图片合成 PDF,每图一页、等比缩放居中;images 为空抛参数错误;pageWidthMm/pageHeightMm ≤0 用 A4(210×297);marginMm 负数归 0。PdfResult.pages = 图片数
textToPdf textToPdf(text, dest, fontSize, fontPath): PdfResult 文本生成 PDF(基础分页:按 \n 切行 + 按宽度换行,溢出翻页),A4 页;fontSize ≤0 用 12;fontPath 非空 → 嵌入该 TTF(支持中文),为空 → 内置 Helvetica(仅拉丁字符)
pdfPageCount pdfPageCount(src): number 读取已有 PDF 的页数(文件不存在 / 非 PDF 抛错)
mergePdfs mergePdfs(srcs, dest): PdfResult 多个 PDF 按 srcs 顺序合并为一个(重编号对象 id 防碰撞);srcs 为空 / dest 为空抛参数错误;某项不存在 / 非 PDF 抛错。PdfResult.pages = 各输入文档页数之和
splitPdf splitPdf(src, destDir, prefix): number src 每页拆成独立单页 PDF 写到 destDir/<prefix>-<n>.pdf(n 从 1 起);返回拆出的页数;src/destDir 为空、src 非 PDF 抛错

类型

// imagesToPdf / textToPdf 返回(字段 camelCase)
type PdfResult = { pages: number; sizeBytes: number; costMs: number };
  • imagesToPdfimages 入参为 string[](对应 原生 Vec<String>)——本仓首个数组入参,桥接层把 UTS string[] 转成 Kotlin List<String> / Swift [String]
  • 入参 pageWidthMm / pageHeightMm / marginMm / fontSizenumber 传入,桥接层校验有限后转 Float;允许 ≤0(由 自研核心做「取默认」语义兜底)。
  • PdfResult.pages:PDF 页数(imagesToPdf = 图片数;textToPdf = 分页后页数)。
  • PdfResult.sizeBytes:写入 PDF 的文件字节数。
  • PdfResult.costMs:只计「生成段」耗时(毫秒,不含磁盘 IO)。
  • 中文支持:内置 Helvetica 仅覆盖拉丁字符;textToPdf 要排版中文,需通过 fontPath 传一个中文 TTF 字体路径嵌入。

用法

import {
  imagesToPdf,
  textToPdf,
  pdfPageCount,
  mergePdfs,
  splitPdf
} from "@/uni_modules/nex-pdf";

// 多图合成 PDF:A4(传 0 用默认)、页边距 10mm
const r = imagesToPdf([imgPathA, imgPathB], destPdfPath, 0, 0, 10);
console.log(r.pages, r.sizeBytes, r.costMs); // 2 ...

// 文本生成 PDF:字号 14,内置字体(仅拉丁);中文则传字体路径
const t = textToPdf("Hello nex-pdf", destPdfPath2, 14, "");
console.log(t.pages, t.sizeBytes, t.costMs);

// 读取已有 PDF 页数(也可对刚生成的 PDF 回读做 round-trip 校验)
const pages = pdfPageCount(destPdfPath); // number
console.log(pages);

// 合并多个 PDF 为一个:pages = 各文档页数之和
const m = mergePdfs([pdfA, pdfB], mergedPdfPath);
console.log(m.pages, m.sizeBytes, m.costMs);

// 按页拆分:destDir/part-1.pdf、part-2.pdf …,返回拆出的页数
const count = splitPdf(srcPdfPath, destDir, "part"); // number
console.log(count);

平台与调试边界

  • app-android / app-ios;H5、各家小程序不支持。
  • Android 本地真机调试 原生库 需 HBuilderX ≥ 4.26(自定义调试基座),云打包不受此限。
  • iOS 因 原生扩展库 含 Swift,宿主原生工程需开启「支持 Swift」。
  • 最终 App 打包由 HBuilderX / @dcloudio CLI 完成。

隐私、权限声明

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

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

插件不采集任何数据。所有计算/处理均在本地完成,无任何网络请求、不发送数据到任何服务器。

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

暂无用户评论。