更新记录
1.0.0(2026-05-30) 下载此版本
初次提交
平台兼容性
uni-app x(4.75)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | 15 | √ | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
laoqianjunzi-ocr
laoqianjunzi-ocr 是一个面向 uni-app x 的本地 OCR 与文档处理插件,提供图片文本识别、文档整理增强、结构化字段提取、会话式分析、JPEG/PDF/Base64 导出等能力。
插件当前文档只说明现有正式接口与现有组件能力,示例全部基于 uni-app x 当前 API 编写。
功能概览
- 图片全文 OCR
- 按行 OCR 结果输出
- 文档边界整理与图像增强
- 身份证、银行卡、车牌、VIN、营业执照、社保卡、登机牌、答题卡、合同等场景提取
- 会话式连续分析
- JPEG、PDF、Base64 导出
- 运行时能力探测
适用平台
| 平台 | 支持情况 | 说明 |
|---|---|---|
| uni-app x Web | 支持 | 使用 Canvas + Optional Tesseract,OCR 依赖运行时注入的 Tesseract |
| uni-app x Android | 支持 | 原生桥接能力已启用 |
| uni-app x iOS | 支持 | 原生桥接能力已启用 |
| uni-app x Harmony | 支持 | 原生桥接能力已启用 |
版本要求
HBuilderX>=5.07uni-app x>=4.75- Android 最低版本
21 - iOS 最低版本
15
权限与运行说明
Android
插件已声明相机权限:
android.permission.CAMERA
如果业务流程需要从系统相册选图,实际项目中还应根据目标平台版本确认相册访问授权流程。
iOS
插件已包含以下权限说明:
- 相机使用说明
- 相册读取说明
- 相册写入说明
导出图片或 PDF 时,若业务需要保存到系统相册或文件位置,应确保目标环境具备对应写入权限。
Web
- Web 端 OCR 识别依赖全局
Tesseract - Web 端
PDF导出不可用 - Web 端导出
jpeg或base64时,结果通常是 Data URL 字符串
安装后导入
import {
describeOcrRuntime,
inspectDocumentImage,
polishDocumentImage,
readTextFromImage,
exportDocumentFile,
openSmartSession,
pushSmartSessionFrame,
pauseSmartSession,
resumeSmartSession,
closeSmartSession,
scanIdCard,
scanBankCard,
scanVehiclePlate
} from "@/uni_modules/laoqianjunzi-ocr"
import type {
LqjDocumentOptions,
LqjDocumentResult,
LqjExportOptions,
LqjOcrFailure,
LqjOcrLanguage,
LqjPolishOptions,
LqjSessionActionOptions,
LqjSessionFrameOptions,
LqjSessionOptions,
LqjTextReadOptions
} from "@/uni_modules/laoqianjunzi-ocr"
快速开始
推荐先通过 uni.chooseImage 获取图片路径,再调用插件接口处理。imagePath 需要传入当前平台可访问的本地图片路径。
<script setup lang="uts">
import { inspectDocumentImage } from "@/uni_modules/laoqianjunzi-ocr"
import type { LqjDocumentOptions, LqjDocumentResult, LqjOcrFailure } from "@/uni_modules/laoqianjunzi-ocr"
const imagePath = ref("")
const resultText = ref("等待识别")
function chooseImage() : void {
uni.chooseImage({
count : 1,
success : (res) => {
if (res.tempFilePaths.length > 0) {
imagePath.value = res.tempFilePaths[0]
}
}
})
}
function runInspect() : void {
if (imagePath.value.length == 0) {
uni.showToast({
title : "请先选择图片",
icon : "none"
})
return
}
const options : LqjDocumentOptions = {
imagePath : imagePath.value,
languages : ["zh", "en"] as LqjOcrLanguage[],
mode : "balanced",
documentHint : "auto",
polishBeforeRead : true,
polishMode : "color",
success : (res : LqjDocumentResult) => {
resultText.value = res.fullText.length > 0 ? res.fullText : "未识别到文本"
},
fail : (err : LqjOcrFailure) => {
uni.showToast({
title : err.errMsg,
icon : "none"
})
}
}
inspectDocumentImage(options)
}
</script>
运行时能力探测
使用 describeOcrRuntime() 可以在页面初始化时读取当前平台支持情况。
const runtimeInfo = describeOcrRuntime()
console.log(runtimeInfo.platformName)
console.log(runtimeInfo.engineName)
console.log(runtimeInfo.supportsOcr)
console.log(runtimeInfo.supportsPdfExport)
console.log(runtimeInfo.supportsSession)
console.log(runtimeInfo.usesNativeBridge)
返回结构:
| 字段 | 类型 | 说明 |
|---|---|---|
platformName |
string |
当前平台名称 |
engineName |
string |
当前 OCR / 导出引擎描述 |
supportsOcr |
boolean |
是否支持 OCR 识别 |
supportsPdfExport |
boolean |
是否支持 PDF 导出 |
supportsSession |
boolean |
是否支持会话能力 |
usesNativeBridge |
boolean |
是否启用原生桥接 |
核心数据类型
OCR 语言 LqjOcrLanguage
| 值 | 说明 |
|---|---|
zh |
中文 |
en |
英文 |
ja |
日文 |
ko |
韩文 |
deva |
天城文 |
识别模式 LqjOcrMode
| 值 | 说明 |
|---|---|
fast |
更偏向速度 |
balanced |
速度与效果平衡,推荐默认使用 |
accurate |
更偏向识别质量 |
文档提示 LqjDocumentHint
| 值 | 说明 |
|---|---|
auto |
自动判断 |
plainText |
普通文本 |
idCard |
身份证 |
bankCard |
银行卡 |
vehiclePlate |
车牌 |
vehicleVin |
车辆 VIN |
businessPermit |
营业执照 |
socialCard |
社保卡 |
boardingPass |
登机牌 |
examSheet |
答题卡 |
contract |
合同 |
整理模式 LqjPolishMode
| 值 | 说明 |
|---|---|
original |
保持原图 |
color |
彩色整理 |
grayscale |
灰度整理 |
binary |
二值化 |
contrast |
对比度增强 |
导出格式 LqjExportFormat
| 值 | 说明 |
|---|---|
jpeg |
导出 JPEG |
pdf |
导出 PDF |
base64 |
导出 Base64 字符串 |
API 一览
1. describeOcrRuntime()
读取当前平台运行时支持情况。
2. readTextFromImage(options)
执行全文 OCR。
关键参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
imagePath |
string |
是 | 待识别图片路径 |
languages |
LqjOcrLanguage[] \| null |
否 | 语言列表 |
mode |
LqjOcrMode |
否 | 识别模式 |
success |
(res) => void |
否 | 成功回调 |
fail |
(err) => void |
否 | 失败回调 |
complete |
(res, err) => void |
否 | 完成回调 |
返回结果重点字段:
| 字段 | 类型 | 说明 |
|---|---|---|
fullText |
string |
合并后的全文 |
blocks |
LqjTextUnit[] |
段落级结果 |
lines |
LqjTextUnit[] |
行级结果 |
confidence |
number |
置信度 |
durationMs |
number |
耗时 |
示例:
const options : LqjTextReadOptions = {
imagePath : imagePath.value,
languages : ["zh", "en"] as LqjOcrLanguage[],
mode : "balanced",
success : (res) => {
console.log(res.fullText)
}
}
readTextFromImage(options)
3. readLinesFromImage(options)
按行输出 OCR 结果,参数与 readTextFromImage 一致,适合票据、表单、段落拆行预览等场景。
4. polishDocumentImage(options)
执行文档裁切、拉伸修正、灰度化、二值化或增强处理。
关键参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
imagePath |
string |
是 | 输入图片路径 |
corners |
LqjPoint[] \| null |
否 | 文档四角坐标 |
polishMode |
LqjPolishMode |
否 | 整理模式 |
stretchFix |
boolean |
否 | 是否执行拉伸修正 |
返回结果重点字段:
| 字段 | 类型 | 说明 |
|---|---|---|
outputPath |
string |
整理后的结果路径 |
previewPath |
string |
预览图路径 |
corners |
LqjPoint[] |
结果使用的四角坐标 |
quality |
LqjQualitySnapshot |
质量快照 |
示例:
const options : LqjPolishOptions = {
imagePath : imagePath.value,
polishMode : "contrast",
stretchFix : true,
success : (res) => {
console.log(res.outputPath)
}
}
polishDocumentImage(options)
5. inspectDocumentImage(options)
执行文档分析,输出全文、行块结果、文档类型标签、字段提取、整理结果和质量信息。
关键参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
imagePath |
string |
是 | 输入图片路径 |
languages |
LqjOcrLanguage[] \| null |
否 | 语言列表 |
mode |
LqjOcrMode |
否 | 识别模式 |
documentHint |
LqjDocumentHint |
否 | 文档提示 |
polishBeforeRead |
boolean |
否 | 识别前是否先整理 |
polishMode |
LqjPolishMode |
否 | 整理模式 |
corners |
LqjPoint[] \| null |
否 | 自定义文档四角 |
返回结果重点字段:
| 字段 | 类型 | 说明 |
|---|---|---|
documentHint |
LqjDocumentHint |
实际使用的提示类型 |
documentLabel |
string |
面向展示的文档标签 |
fields |
LqjDocumentField[] |
结构化字段 |
warnings |
string[] |
质量或识别提醒 |
polishedPath |
string \| null |
识别前整理输出路径 |
confidence |
number |
识别置信度 |
6. 场景化快捷方法
这些方法本质上是对 inspectDocumentImage 的语义化封装,内部会自动带上对应 documentHint:
scanPlainText(options)scanIdCard(options)scanBankCard(options)scanVehiclePlate(options)scanVehicleVin(options)scanBusinessPermit(options)scanSocialCard(options)scanBoardingPass(options)scanExamSheet(options)scanContract(options)
示例:
scanIdCard({
imagePath : imagePath.value,
polishBeforeRead : true,
polishMode : "color",
success : (res) => {
console.log(res.documentLabel)
console.log(res.fields)
}
} as LqjDocumentOptions)
7. exportDocumentFile(options)
将图片按指定模式整理后导出为 jpeg、pdf 或 base64。
关键参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
imagePath |
string |
是 | 输入图片路径 |
format |
LqjExportFormat |
是 | 导出格式 |
polishMode |
LqjPolishMode |
否 | 导出前整理模式 |
quality |
number |
否 | 导出质量 |
corners |
LqjPoint[] \| null |
否 | 文档四角 |
返回结果重点字段:
| 字段 | 类型 | 说明 |
|---|---|---|
outputPath |
string |
导出结果路径或 Data URL |
format |
LqjExportFormat |
导出格式 |
mimeType |
string |
结果 MIME 类型 |
base64Data |
string \| null |
base64 导出结果 |
示例:
const options : LqjExportOptions = {
imagePath : imagePath.value,
format : "pdf",
polishMode : "color",
quality : 92,
success : (res) => {
console.log(res.outputPath)
}
}
exportDocumentFile(options)
8. readImageBase64(options)
直接读取图片 Base64 内容。
适用场景:
- 需要把图片内容转成字符串后再上传或二次处理
- 只需要读取原图内容,不需要文档分析或字段提取
9. 会话式分析 API
会话接口适合连续扫描或多次推送图像的流程。
openSmartSession(options)
开启一个分析会话,返回 LqjSessionSnapshot。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
sessionId |
string |
否 | 会话唯一标识 |
documentHint |
LqjDocumentHint |
否 | 默认文档提示 |
polishMode |
LqjPolishMode |
否 | 默认整理模式 |
autoPolish |
boolean |
否 | 是否自动整理 |
pushSmartSessionFrame(options)
向会话推送一张图片,输出 LqjDocumentResult。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
sessionId |
string |
否 | 会话 ID |
imagePath |
string |
是 | 当前帧图片路径 |
languages |
LqjOcrLanguage[] \| null |
否 | 语言列表 |
mode |
LqjOcrMode |
否 | 识别模式 |
documentHint |
LqjDocumentHint \| null |
否 | 当前帧覆盖提示 |
pauseSmartSession(options) / resumeSmartSession(options) / closeSmartSession(options)
用于暂停、恢复、关闭会话。成功回调返回最新 LqjSessionSnapshot。
会话示例:
const session = openSmartSession({
sessionId : "demo-session",
documentHint : "contract",
polishMode : "color",
autoPolish : true
} as LqjSessionOptions)
const frameOptions : LqjSessionFrameOptions = {
sessionId : session.sessionId,
imagePath : imagePath.value,
languages : ["zh", "en"] as LqjOcrLanguage[],
mode : "balanced",
success : (res) => {
console.log(res.documentLabel)
}
}
pushSmartSessionFrame(frameOptions)
pauseSmartSession({
sessionId : session.sessionId
} as LqjSessionActionOptions)
resumeSmartSession({
sessionId : session.sessionId
} as LqjSessionActionOptions)
closeSmartSession({
sessionId : session.sessionId
} as LqjSessionActionOptions)
可选组件
插件内置 easycom 组件:lqj-ocr-live
用途:
- 封装实时扫描容器
- 通过
params字符串驱动内部行为 - 通过
onEvent事件向外输出结果
当前组件对外暴露的基础约定:
| 项目 | 说明 |
|---|---|
| 组件名 | lqj-ocr-live |
props.params |
string,用于传入 JSON 字符串协议 |
emits.onEvent |
事件回调,事件体中包含 detail |
Web 兼容模式下支持的业务指令:
startScanstopScanswitchCamerasetParams
示例:
<template>
<view class="page-root">
<lqj-ocr-live :params="liveParams" @onEvent="handleLiveEvent"></lqj-ocr-live>
</view>
</template>
<script setup lang="uts">
const liveParams = ref('{"businessArray":[{"business":"startScan","params":{"type":"TextDetectorChinese"}}]}')
function handleLiveEvent(event : any) : void {
const detail = event != null && event.detail != null ? event.detail as UTSJSONObject : null
if (detail == null) {
return
}
console.log(detail)
}
</script>
<style>
.page-root {
display: flex;
flex-direction: column;
flex: 1;
}
</style>
错误码
| 错误码 | 含义 |
|---|---|
8801 |
当前平台暂未开放这项能力 |
8802 |
图片路径不能为空 |
8803 |
无法读取图片数据 |
8804 |
文本识别执行失败 |
8805 |
分析会话不存在 |
8806 |
分析会话当前不可用 |
8807 |
当前运行环境缺少 OCR 引擎 |
8808 |
文档导出失败 |
8809 |
文档整理失败 |
8810 |
参数不合法 |
8811 |
读取 Base64 失败 |
8812 |
当前格式暂不支持导出 |
8813 |
当前语言配置暂不支持 |
8814 |
文档字段提取失败 |
8815 |
图片增强失败 |
使用建议
1. 图片路径建议
- 推荐优先使用
uni.chooseImage获取本地图片路径 - Android 某些环境下可能返回
content://路径,若业务现场遇到读取失败,可先复制到应用可访问目录后再传入插件 imagePath不能为空,否则会直接触发8802
2. 文档场景建议
- 普通文本建议使用
scanPlainText或inspectDocumentImage({ documentHint : "plainText" }) - 证件类场景建议直接使用对应快捷方法,例如
scanIdCard、scanBankCard - 当文档边界清晰时,开启
polishBeforeRead往往更容易获得稳定结果
3. Web 端建议
- 在页面启动阶段先调用
describeOcrRuntime()判断是否已注入Tesseract - 若
supportsOcr为false,应在业务层提示当前 Web 环境缺少 OCR 引擎 - Web 端不要把
pdf作为默认导出格式
4. 会话使用建议
sessionId建议由业务侧显式传入,便于多实例隔离- 推帧前先确保会话处于
running状态 - 会话结束后主动调用
closeSmartSession释放状态
目录说明
| 路径 | 说明 |
|---|---|
pages/index.uvue |
插件演示页面 |
components/lqj-ocr-live/ |
实时扫描组件 |
utssdk/index.uts |
统一导出入口 |
utssdk/interface.uts |
类型声明与接口声明 |
建议验证方式
集成后建议至少验证以下流程:
- 选择图片并执行全文 OCR
- 执行一个结构化场景识别,例如身份证或银行卡
- 执行一次文档整理增强
- 分别验证
jpeg与目标平台可用的导出格式 - 在业务页启动时打印
describeOcrRuntime()结果确认平台能力

收藏人数:
https://gitee.com/laoqianjunzi/laoqianjunzi-ocr
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 1144
赞赏 2
下载 12098935
赞赏 1918
赞赏
京公网安备:11010802035340号