[特殊字符] 开源一款基于 PaddleOCR 的纯离线 OCR 识别插件 | 支持身份证、银行卡、驾驶证识别

🚀 开源一款基于 PaddleOCR 的纯离线 OCR 识别插件 | 支持身份证、银行卡、驾驶证识别

不依赖任何云服务,所有识别在本地完成,隐私安全有保障!


前言

在移动应用开发中,OCR 识别是一个常见需求,尤其是证件识别场景:身份证实名认证、银行卡绑定、驾驶证信息录入等。

然而,市面上大多数 OCR 方案都依赖云服务 API,存在以下问题:

  • 💰 成本高 - 按调用次数收费,量大时费用惊人
  • 🌐 需要网络 - 离线场景无法使用
  • 🔓 隐私风险 - 敏感证件数据上传到第三方服务器

为了解决这些痛点,我开发了 lf-OCR ------ 一款基于 PaddleOCR 的纯离线 OCR 识别插件,专为 uni-app 多端开发设计。


✨ 核心特性

特性 说明
🔒 纯离线 所有模型和依赖本地化,无需网络即可使用
🚀 高性能 基于 PaddleOCR,识别速度快、准确率高
🎯 中文优化 专为中文场景优化,识别效果出色
📱 多平台 支持 H5、App (Android/iOS)
🪪 证件识别 内置身份证、银行卡、驾驶证解析模板
智能验证 自动验证证件有效性(校验码、有效期等)
🔄 自动识别 智能判断证件正反面,无需手动指定
🔧 易于扩展 支持自定义模型和识别模板

📦 技术架构

复制代码
lf-OCR
├── 核心引擎 (PaddleOCR + ONNX Runtime + OpenCV.js)
├── 证件解析模板 (身份证/银行卡/驾驶证/通用)
├── 校验工具 (身份证号/银行卡号/手机号等)
└── 格式化工具 (日期/金额/手机号等)

整个插件大小约 35MB,包含:

  • ppocr_det.onnx - 文字检测模型
  • ppocr_rec.onnx - 文字识别模型
  • OpenCV.js - 图像处理
  • ONNX Runtime - 模型推理

🎮 快速上手

安装

在 HBuilder 插件市场搜索 lf-OCR 导入,或手动复制到 uni_modules 目录。

基础使用

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");

if (result.valid) {
  console.log("姓名:", result.name);
  console.log("身份证号:", result.idNumber);
  console.log("地址:", result.address);
}

返回数据示例

身份证正面识别结果:

json 复制代码
{
  "name": "张三",
  "gender": "男",
  "ethnicity": "汉族",
  "birthDate": "1990年01月01日",
  "address": "北京市朝阳区某某街道123号",
  "idNumber": "110101199001011234",
  "valid": true,
  "side": "front"
}

🪪 支持的证件类型

1. 身份证识别

自动判断正反面,提取完整信息:

javascript 复制代码
import { parseIdCard, validateIdCard } from "@/uni_modules/lf-OCR/index.js";

const result = parseIdCard(ocrText);

if (result.side === "front") {
  // 正面:姓名、性别、民族、出生日期、地址、身份证号
  const validation = validateIdCard(result.idNumber);
  console.log("年龄:", validation.info.age);
} else {
  // 背面:签发机关、有效期限
  console.log("是否过期:", result.isExpired);
}

2. 银行卡识别

支持国内主流银行卡,自动识别银行和卡类型:

javascript 复制代码
import { parseBankCard } from "@/uni_modules/lf-OCR/index.js";

const result = parseBankCard(ocrText);
console.log("卡号:", result.cardNumberFormatted); // 6222 0212 3456 7890 123
console.log("银行:", result.bankName); // 中国工商银行
console.log("类型:", result.cardType); // 借记卡

3. 驾驶证识别

支持主页和副页识别:

javascript 复制代码
import { parseDriverLicense } from "@/uni_modules/lf-OCR/index.js";

const result = parseDriverLicense(ocrText);
console.log("准驾车型:", result.licenseClass); // C1
console.log("车型描述:", result.licenseClassDesc); // 小型汽车

✅ 内置校验功能

插件不仅能识别文字,还能验证证件有效性

javascript 复制代码
import {
  validateIdCard,
  validateBankCard,
} from "@/uni_modules/lf-OCR/index.js";

// 身份证校验(含校验码验证)
const idResult = validateIdCard("110101199001011234");
if (idResult.valid) {
  console.log("地区:", idResult.info.region);
  console.log("出生日期:", idResult.info.birthDate);
  console.log("性别:", idResult.info.gender);
  console.log("年龄:", idResult.info.age);
}

// 银行卡校验(Luhn 算法)
const bankResult = validateBankCard("6222021234567890123");
console.log("是否有效:", bankResult.valid);

🔧 扩展开发

更换 OCR 模型

支持替换为其他 ONNX 格式模型:

复制代码
hybrid/html/models/
├── ppocr_det.onnx      # 替换检测模型
├── ppocr_rec.onnx      # 替换识别模型
└── ppocr_keys_v1.txt   # 替换字典文件

新增识别模板

js_sdk/templates/ 目录下创建新模板,实现自定义证件解析:

javascript 复制代码
// js_sdk/templates/passport.js
export function parsePassport(text, lines = []) {
  const result = {
    name: "",
    passportNumber: "",
    nationality: "",
    valid: false,
  };

  // 实现字段提取逻辑...

  return result;
}

📱 平台兼容性

平台 支持
H5
App (Android)
App (iOS)
微信小程序 ❌ (不支持 WebAssembly)

🔗 项目地址


📷 页面截图


🤔 常见问题

Q: 识别准确率如何?

A: 基于 PaddleOCR,中文识别准确率可达 95% 以上。建议使用清晰、光线充足的图片。

Q: 支持哪些证件?

A: 目前内置身份证、银行卡、驾驶证模板,同时支持通用文字识别。后续会持续更新。

Q: 如何添加新证件类型?

A: 在 js_sdk/templates/ 目录下创建新模板文件,参考现有模板实现即可。


📄 开源协议

MIT License - 可免费用于商业项目


🙏 致谢


如果这个项目对你有帮助,欢迎 ⭐️ Star 支持一下!有问题或建议也欢迎提 Issue 讨论。

相关推荐
hxjhnct3 分钟前
Vue 实现多行文本“展开收起”
前端·javascript·vue.js
橙子的AI笔记4 分钟前
2025年全球最受欢迎的JS鉴权框架Better Auth,3分钟带你学会
前端·ai编程
百锦再5 分钟前
Vue大屏开发全流程及技术细节详解
前端·javascript·vue.js·微信小程序·小程序·架构·ecmascript
独自破碎E9 分钟前
你知道Spring Boot配置文件的加载优先级吗?
前端·spring boot·后端
一树山茶11 分钟前
Vue变化响应
前端
黑土豆14 分钟前
一次真实的流式踩坑:fetchEventSource vs fetch流读取的本质区别
前端·javascript·ai编程
代码猎人16 分钟前
substring和substr有什么区别
前端
pimkle17 分钟前
visactor vTable 在移动端支持 ellipsis 气泡
前端
donecoding17 分钟前
告别 scrollIntoView 的“越级滚动”:一行代码解决横向滚动问题
前端·javascript