更新记录
1.0.0(2026-09-30)
首次发布
平台兼容性
uni-app(3.8.4)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | × | × | × | √ | √ | √ | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(3.8.4)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | × | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
离线 OCR(PP-OCRv4)
购买前请先下载测试是否满足需求,遇到问题请在交流群反馈,作者会及时修复,切勿随意差评
插件测试使用方法
- 选择试用:在 DCloud 插件市场点击「试用」,绑定要试用的项目
appid。 - 下载到本地项目:选择已绑定的项目后,下载插件到
uni_modules/xiake-uts-ocr/。 - 引入插件:在需要使用的页面/UTS 文件里引入:
import { uTSOCRRecognize, startScan, OCR_TYPE } from '@/uni_modules/xiake-uts-ocr'如果是 uni-app(Vue3) 项目,请用:
const ocr = uni.requireNativePlugin('xiake-uts-ocr') // ocr.uTSOCRRecognize({...}) // ocr.startScan({...}) - 制作自定义基座:点击 发布 → 云打包 → 选择制作基座,等待基座制作完成。本插件含原生
.so和 OCR 模型,必须打包自定义基座,标准基座无法运行。 - 运行到手机:点击 运行 → 运行到手机或模拟器 → 运行到 Android App 基座 → 使用自定义基座运行 → 选择手机 → 运行。
- 卸载旧基座:如果手机上之前安装过该项目的基座,请先卸载旧基座,避免资源/缓存冲突。
简介
基于 PP-OCRv4(NCNN) 的端侧离线 OCR UTS 插件,支持 uni-app 与 uni-app x 的 Android App 端(iOS 暂未实现)。
数据全部本地处理,不联网、不调用任何第三方/云端接口,飞行模式可用,隐私合规。
支持识别:通用中文/英文文本、身份证正反面、车牌、银行卡、营业执照、社保卡、发票、车架号(VIN)、行驶证、手机号、电动车牌、自定义证件。
支持平台
| 平台 | uni-app (Vue3) | uni-app x |
|---|---|---|
| Android | ✅ 支持 | ✅ 支持 |
| iOS | ❌ 暂不支持 | ❌ 暂不支持 |
快速开始
方式一:调起内置扫描页(推荐用于证件/卡片)
import { startScan, OCR_TYPE } from '@/uni_modules/xiake-uts-ocr'
startScan({
params: {
recognizeType: OCR_TYPE.ID_CARD_FRONT,
showPhotoAlbum: true,
scanHintText: '请将身份证正面放入框内',
complete: (res: string) => {
const json = JSON.parse(res)
if (json.status === 'success') {
console.log('原始文本', json.result.text)
console.log('身份证号', json.result.idNo)
} else {
console.error(json.message)
}
}
}
})
方式二:识别已有图片(推荐用于相册/后端回传)
import { uTSOCRRecognize, OCR_TYPE } from '@/uni_modules/xiake-uts-ocr'
uTSOCRRecognize({
params: JSON.stringify({
recognizeType: OCR_TYPE.INVOICE,
imagePath: '/storage/emulated/0/Pictures/invoice.jpg'
}),
complete: (res: string) => {
const json = JSON.parse(res)
console.log(json.result)
}
})
uni-app(Vue3) 项目需把
uTSOCRRecognize/startScan通过uni.requireNativePlugin('xiake-uts-ocr')取出后再调用。
OCR_TYPE 识别类型
从插件导出:
import { OCR_TYPE } from '@/uni_modules/xiake-uts-ocr'
| 常量 | 值 | 说明 |
|---|---|---|
OCR_TYPE.GENERAL |
0 | 通用文本识别 |
OCR_TYPE.ID_CARD_FRONT |
1 | 身份证正面 |
OCR_TYPE.ID_CARD_BACK |
2 | 身份证反面 |
OCR_TYPE.PLATE |
3 | 车牌 |
OCR_TYPE.BANK_CARD |
4 | 银行卡 |
OCR_TYPE.BUSINESS_LICENSE |
5 | 营业执照 |
OCR_TYPE.CUSTOM |
6 | 自定义证件 |
OCR_TYPE.SOCIAL_SECURITY |
7 | 社保卡 |
OCR_TYPE.INVOICE |
8 | 发票 |
OCR_TYPE.VIN |
9 | 车架号 |
OCR_TYPE.VEHICLE_LICENSE |
10 | 行驶证 |
OCR_TYPE.PHONE |
11 | 手机号 |
OCR_TYPE.BIKE_PLATE |
12 | 电动车/自行车牌 |
API 说明
startScan(options: StartScanCall)
调起原生扫描页:相机预览 + 取景框 + 手电筒/相册/快门。用户拍照后自动进入识别流程。
type StartScanCall = {
params: string | object // 推荐传对象字面量
complete: (res: string) => void
}
uTSOCRRecognize(options: RecognizeCall)
对本地图片路径做识别,返回 JSON 字符串。
type RecognizeCall = {
params: string | object
complete: (res: string) => void
}
params 中必须包含 recognizeType;方式二(JSON.stringify)时建议包含 imagePath。
getBase64FromFilePath(filePath, complete)
把本地图片文件转成 Base64 DataURL 返回。
getBase64FromFilePath('/storage/.../xxx.jpg', (base64: string) => {
console.log(base64)
})
参数详解(XtOcrOptions)
| 字段 | 类型 | 说明 |
|---|---|---|
recognizeType |
number | 必填,0-12,见 OCR_TYPE |
imagePath |
string | 方式二必填:待识别图片的本地绝对路径 |
imgLocation |
number | 通用文本(recognizeType=0):0=相机 1=相册 |
pickTextFromImg |
boolean | 通用文本:是否手动选区 |
textAreaType |
number | 通用文本且非手动选区:0=block 1=line 2=element 3=symbol |
pickTextAreaType |
number | 通用文本且手动选区:同上 |
forceVertical |
boolean | recognizeType≤4:强制竖屏(默认横屏识别率更高) |
hasFrame |
boolean | recognizeType=0:是否显示扫描框(默认 true);false=识别整张图 |
scanHintText |
string | 扫描界面提示文案 |
showPhotoAlbum |
boolean | recognizeType>0:证件扫描页是否支持相册 |
showLightController |
boolean | 手电筒开关(默认 true) |
showVibrate |
boolean | 成功震动(默认 true) |
isSupportZoom |
boolean | 扫描界面缩放(默认 false) |
showBeep |
boolean | 成功 beep 音(默认 false) |
customizeTags |
string | recognizeType=6:JSON 数组字符串 [{typeName,typeTag}] |
customizeKeyWords |
string | recognizeType=6:自定义关键词,### 分隔 |
skipMatchParams |
string | 营业执照/行驶证:# 分隔跳过项 |
multiVerify |
boolean | 车牌/车架号:以速度换准确率 |
multiOrient |
boolean | true=对 0/90/180/270 四个方向各识别一次(兼容横拍);false=仅正向(默认)。身份证正反面始终走四向 |
scanColor |
string | 扫描线颜色,格式 #AARRGGBB |
bgColor |
string | 扫描页背景色,默认 #64000000 |
cameraDevice |
string | 低端芯片机型兼容,机型名 ## 分隔 |
customerToken |
string | 定制界面 token |
返回值说明
成功回调返回字符串,解析后结构如下:
{
"status": "success",
"result": {
"text": "识别出的完整原始文本",
"idNo": "身份证号",
"name": "姓名",
"...": "...",
"blocks": [
{
"blockText": "文本块",
"blockCornerPoints": [{ "x": 0, "y": 0 }, { "x": 100, "y": 0 }, { "x": 100, "y": 30 }, { "x": 0, "y": 30 }],
"blockBoundingBox": { "left": 0, "top": 0, "right": 100, "bottom": 30 }
}
],
"costMs": 1234,
"debug": { "api": "roi", "imgW": 1039, "imgH": 842, "...": "..." }
}
}
text:原始 OCR 文本。- 其余字段为结构化字段(不同 recognizeType 返回不同 key,未识别到返回空字符串)。
blocks:通用文本的逐块坐标结果。costMs:识别耗时(毫秒)。debug:调试信息。
常见结构化字段示例
| 类型 | 返回字段 |
|---|---|
| 身份证正面 | idNo、name、sex、nation、birthday、address |
| 身份证反面 | issueOrg、validPeriod |
| 车牌 | licensePlate、licensePlateType、TypeName |
| 银行卡 | cardId |
| 营业执照 | socialCreditCode、businessLicenseNumber、businessName、legalPeople、businessType、businessArea、businessAddress、registerMoney、createDate、validDate |
| 发票 | invoiceCode、invoiceNumber、invoiceDate、amount、tax、total、buyer、seller |
| 车架号 | vin |
| 手机号 | phoneNumbers |
| 电动车牌 | licensePlate |
具体字段以真机返回为准;证件因拍照角度/模糊/OCR 噪声,某些字段可能为空字符串。
自定义证件
recognizeType: OCR_TYPE.CUSTOM 时,通过 customizeTags 动态配置要抽取的字段。
uTSOCRRecognize({
params: JSON.stringify({
recognizeType: OCR_TYPE.CUSTOM,
imagePath: '/storage/.../custom_card.jpg',
customizeTags: JSON.stringify([
{ typeName: '姓名', typeTag: 'name' },
{ typeName: '工号', typeTag: 'workNo' },
{ typeName: '部门', typeTag: 'dept' }
])
}),
complete: (res: string) => {
const json = JSON.parse(res)
console.log(json.result.name)
console.log(json.result.workNo)
console.log(json.result.dept)
}
})
typeName:文本中的匹配锚点(如「姓名」)。typeTag:返回结果中的 key。
图片路径与方向
imagePath必须是 Android 本地绝对文件路径,且能被原生BitmapFactory.decodeFile直接解码。uni.chooseImage返回的_doc/.../_downloads/...或带file://前缀的路径不能直接传入。请先用plus.io.convertAbsoluteFileSystem转换:uni.chooseImage({ count: 1, success: (res) => { let path = res.tempFilePaths[0] // #ifdef APP-PLUS path = plus.io.convertAbsoluteFileSystem(path) // #endif uTSOCRRecognize({ params: JSON.stringify({ recognizeType: 0, imagePath: path }), complete: () => {} }) }})startScan内部落盘的路径已为绝对路径,无需转换。- 插件会自动读取图片 EXIF 方向标签并转正,竖握横拍照片无需手动旋转。
注意事项
- 必须打包自定义基座:插件包含原生
.so、NCNN 模型、Kotlin/UTS 源码,标准基座无法运行;修改插件源码或.so后需重新制作基座。 - 插件不热更:
index.uts(UTS 层)与libppocr.so(原生层)都不支持热更新,更新后必须重新打包基座。 - Android 权限:插件
AndroidManifest.xml已声明必要权限;如目标系统为 Android 6+,请在业务侧动态申请相机/存储权限。 - 体积控制:云打包限额 60MB。本插件打包必需内容约 22MB(assets 模型 13MB + libs 8.8MB)。
native/obj、native/libs、app-android/obj等本地构建专用物已移出插件目录,不要把这些文件重新拷回插件,否则会导致超限。 - 卸载旧基座:同一项目安装新基座前,建议先卸载旧基座,避免缓存/资源冲突导致识别异常。
开源合规
- 识别引擎基于 PaddleOCR PP-OCRv4(Apache-2.0)与 Tencent/NCNN(BSD)。
- 本插件为独立实现,不复制任何闭源二进制或第三方 Demo,可合法发布到 DCloud 插件市场或 MIT 协议分发。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 2
赞赏 0
下载 12649086
赞赏 1953
赞赏
京公网安备:11010802035340号