# local-OCR
**Repository Path**: lefan_suitable/local-ocr
## Basic Information
- **Project Name**: local-OCR
- **Description**: 基于 PaddleOCR 的纯离线 OCR 识别插件,无需联网,隐私安全
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-06
- **Last Updated**: 2026-01-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# lf-OCR 离线识别插件
> 基于 **PaddleOCR** 的纯离线 OCR 识别插件,无需联网,隐私安全
## ✨ 特性
- 🚀 **高性能** - 基于 PaddleOCR,识别速度快、准确率高
- 🔒 **纯离线** - 所有资源本地化,无需网络即可使用
- 🎯 **中文优化** - 专为中文场景优化,识别效果出色
- 📱 **多平台** - 支持 H5、App (Android/iOS)
- 🪪 **证件识别** - 内置身份证、银行卡、驾驶证模板
- ✅ **智能验证** - 自动验证证件有效性,返回详细验证信息
- 🔄 **自动识别** - 智能判断证件正反面,无需手动指定
- 🔧 **易于扩展** - 支持自定义模型和识别模板
---
## 📦 安装
### uni_modules 方式(推荐)
1. 在 HBuilder 插件市场搜索 `lf-OCR`
2. 点击导入到项目
### 手动安装
将 `uni_modules/lf-OCR` 复制到项目的 `uni_modules` 目录
---
## 📱 平台兼容性
| 平台 | 支持 | 说明 |
| ------------- | ---- | ------------------ |
| H5 | ✅ | 完全支持 |
| App (Android) | ✅ | 通过 web-view |
| App (iOS) | ✅ | 通过 web-view |
| 微信小程序 | ❌ | 不支持 WebAssembly |
| 其他小程序 | ❌ | 不支持 WebAssembly |
---
## 🎮 使用方式
### 方式一:使用 SDK(推荐)
```javascript
import lfOCR from "@/uni_modules/lf-OCR/index.js";
// 初始化
await lfOCR.init({
onProgress: (msg) => console.log("加载进度:", msg),
});
// 识别图片
const result = await lfOCR.recognize(imagePath, "idCard");
console.log("识别结果:", result);
```
### 方式二:使用组件
```vue
```
### 方式三:使用 web-view
```vue
```
---
## 🔧 API 文档
### SDK 方法
```javascript
import lfOCR from "@/uni_modules/lf-OCR/index.js";
// 初始化引擎
await lfOCR.init(options);
// 识别图片
// template: "general" | "idCard" | "bankCard" | "driverLicense"
const result = await lfOCR.recognize(imagePath, template);
// 检查引擎状态
const isReady = lfOCR.isReady();
// 销毁引擎
lfOCR.destroy();
```
### 模板解析器
```javascript
import {
// 身份证
parseIdCard,
parseIdCardFront,
parseIdCardBack,
detectIdCardSide,
// 银行卡
parseBankCard,
// 驾驶证
parseDriverLicense,
// 通用
parseGeneral,
} from "@/uni_modules/lf-OCR/index.js";
```
### 校验工具
```javascript
import {
validateIdCard,
validateBankCard,
validateDriverLicenseNumber,
validatePhone,
validateEmail,
validateLicenseClass,
} from "@/uni_modules/lf-OCR/index.js";
```
### 格式化工具
```javascript
import {
formatDate,
formatAmount,
formatPhone,
formatBankCard,
formatDuration,
} from "@/uni_modules/lf-OCR/index.js";
```
---
## 📋 返回数据格式
### 身份证正面
```javascript
{
name: "张三",
gender: "男",
ethnicity: "汉族",
birthDate: "1990年01月01日",
address: "北京市朝阳区某某街道123号",
idNumber: "110101199001011234",
valid: true,
side: "front",
validationDetails: { ... }
}
```
### 身份证背面
```javascript
{
authority: "北京市公安局朝阳分局",
validPeriod: {
start: "2015.01.01",
end: "2025.01.01" // 或 "长期"
},
valid: true,
isExpired: false,
side: "back"
}
```
### 银行卡
```javascript
{
cardNumber: "6222021234567890123",
cardNumberFormatted: "6222 0212 3456 7890 123",
bankName: "中国工商银行",
cardType: "借记卡",
expiryDate: "12/25",
valid: true,
isExpired: false
}
```
### 驾驶证
```javascript
{
licenseNumber: "123456789012345678",
name: "张三",
gender: "男",
nationality: "中国",
address: "北京市朝阳区某某街道123号",
birthDate: "1990-01-01",
firstIssueDate: "2010-01-01",
licenseClass: "C1",
licenseClassDesc: "小型汽车",
validPeriod: {
start: "2020.01.01",
end: "2026.01.01"
},
valid: true,
page: "main" // 或 "sub"
}
```
---
## 💡 使用示例
### 身份证识别
```javascript
import { parseIdCard, validateIdCard } from "@/uni_modules/lf-OCR/index.js";
// 自动判断正反面
const result = parseIdCard(ocrText);
if (result.side === "front") {
console.log("姓名:", result.name);
console.log("身份证号:", result.idNumber);
// 验证身份证号
const validation = validateIdCard(result.idNumber);
if (validation.valid) {
console.log("年龄:", validation.info.age);
console.log("性别:", validation.info.gender);
}
} else {
console.log("签发机关:", result.authority);
console.log("有效期:", result.validPeriod);
}
```
### 银行卡识别
```javascript
import { parseBankCard } from "@/uni_modules/lf-OCR/index.js";
const result = parseBankCard(ocrText);
if (result.valid) {
console.log("卡号:", result.cardNumberFormatted);
console.log("银行:", result.bankName);
console.log("卡类型:", result.cardType);
if (result.isExpired) {
console.log("银行卡已过期");
}
}
```
### 驾驶证识别
```javascript
import { parseDriverLicense } from "@/uni_modules/lf-OCR/index.js";
const result = parseDriverLicense(ocrText);
if (result.valid) {
console.log("姓名:", result.name);
console.log("准驾车型:", result.licenseClass, result.licenseClassDesc);
console.log("有效期:", result.validPeriod);
}
```
---
## 🔧 扩展开发
### 更换 OCR 模型
插件使用 PaddleOCR 的 ONNX 模型,可以更换为其他兼容模型:
```
hybrid/html/models/
├── ppocr_det.onnx # 文字检测模型
├── ppocr_rec.onnx # 文字识别模型
└── ppocr_keys_v1.txt # 字典文件
```
**更换步骤:**
1. 准备 ONNX 格式的检测模型和识别模型
2. 替换 `hybrid/html/models/` 目录下的对应文件
3. 如使用不同字典,同时替换 `ppocr_keys_v1.txt`
### 新增识别模板
在 `js_sdk/templates/` 目录下创建新模板:
```javascript
// js_sdk/templates/passport.js
export function parsePassport(text, lines = []) {
const result = {
name: "",
passportNumber: "",
nationality: "",
birthDate: "",
expiryDate: "",
valid: false,
};
// 实现字段提取逻辑
// ...
return result;
}
```
**然后在入口文件中导出:**
```javascript
// index.js
export { parsePassport } from "./js_sdk/templates/passport.js";
```
### 添加新的校验规则
在 `js_sdk/utils/validators.js` 中添加:
```javascript
export function validatePassportNumber(passportNumber) {
const result = {
valid: false,
message: "",
};
// 实现校验逻辑
if (/^[A-Z]\d{8}$/.test(passportNumber)) {
result.valid = true;
result.message = "护照号码格式正确";
} else {
result.message = "护照号码格式不正确";
}
return result;
}
```
---
## ⚠️ 注意事项
1. **纯离线运行** - 所有模型和依赖已本地化,无需网络即可使用
2. **图片质量** - 清晰的图片识别效果更好,建议分辨率 ≥ 720p
3. **证件验证** - 插件会验证证件格式和有效性,但重要场景请结合后端验证
4. **隐私保护** - 所有识别在本地完成,不会上传任何数据到服务器
5. **资源大小** - 插件包含 OCR 模型文件,整体约 35MB
---
## 🔍 常见问题
### 识别准确率如何提高?
- 确保证件图片清晰、光线充足
- 避免反光、阴影
- 证件尽量占满取景框
- 保持证件水平,避免倾斜
### 如何判断证件是否有效?
```javascript
const result = parseIdCard(ocrText);
if (result.valid) {
console.log("有效证件");
} else {
console.log("验证详情:", result.validationDetails);
}
```
### 支持的证件类型
- ✅ 身份证(正反面)
- ✅ 银行卡
- ✅ 驾驶证(主页、副页)
- ✅ 通用文字识别
### 如何添加新证件类型?
参考「扩展开发」章节,在 `js_sdk/templates/` 目录下创建新模板文件。
---
## 📄 开源协议
MIT License
---