Linux运维笔记[17]-部署UMI-OCR服务
摘要
在docker中部署UMI-OCR服务, 生成二维码.
声明
本文人类为第一作者, 龙虾为通讯作者.本文包含AI生成内容.
简介
UMI-OCR 简介
项目地址: https://github.com/hiroi-sora/Umi-OCR
概述
Umi-OCR 是一款免费、开源、可批量的离线OCR软件。
| 特性 | 说明 |
|---|---|
| 免费 | 所有代码开源,完全免费 |
| 方便 | 解压即用,离线运行,无需网络 |
| 高效 | 自带高效率的离线OCR引擎,内置多种语言识别库 |
| 灵活 | 支持命令行、HTTP接口等外部调用方式 |
核心功能
- 📸 截图OCR — 截图识别文字
- 📁 批量OCR — 批量导入本地图片识别
- 📄 PDF识别 — 从PDF扫描件中提取文本
- 🔲 二维码 — 扫码或生成二维码图片
- 🧮 公式识别 — 识别数学公式
安装与启动
软件发布包为
.7z压缩包或.7z.exe自解压包。自解压包可在没有安装压缩软件的电脑上直接解压。
无需安装,解压后点击 Umi-OCR.exe 即可启动。
语言设置: 首次打开时,软件会按照系统设置自动切换界面语言(支持繁中、英语、日语等)。
界面布局
Umi-OCR v2 由一系列灵活好用的标签页组成,可按需打开。
| 控件位置 | 功能 |
|---|---|
| 左上角 | 切换窗口置顶 |
| 右上角 | 锁定标签页(防止误触关闭) |
功能详解
1. 截图OCR
- 用快捷键唤起截图,识别图中文字
- 左侧图片预览栏:可用鼠标划选复制
- 右侧识别记录栏:可编辑文字,支持划选多个记录复制
- 支持粘贴图片到Umi-OCR进行识别
公式识别
支持数学公式的识别功能。
OCR文本后处理 - 排版解析方案
整理OCR结果的排版和顺序,使文本更适合阅读:
| 方案 | 说明 |
|---|---|
| 多栏-按自然段换行 | 适合大部分情景,自动识别多栏布局 |
| 多栏-总是换行 | 每段语句都进行换行 |
| 多栏-无换行 | 强制将所有语句合并到同一行 |
| 单栏-按自然段/总是/无换行 | 不区分多栏布局的三种模式 |
| 单栏-保留缩进 | 适用于代码截图,保留行首缩进和空格 |
| 不做处理 | OCR引擎原始输出,默认每段换行 |
✅ 上述方案均自动处理横排和竖排(从右到左)排版
2. 批量OCR
用于批量导入本地图片进行识别。
支持格式: jpg, jpe, jpeg, jfif, png, webp, bmp, tif, tiff
输出格式: txt, jsonl, md, csv(Excel)
特点:
- ✅ 支持文本后处理功能
- ✅ 无数量上限,可一次性导入几百张图片
- ✅ 支持任务完成后自动关机/待机
- ⚠️ 识别超大长图时,请调整:设置→文字识别→限制图像边长→调高数值
特殊功能:忽略区域
用于排除图片中不想要的文字(如水印)。
使用方法:
- 在批量识别页右栏设置中进入忽略区域编辑器
- 按住右键,绘制多个矩形框包裹水印区域
- 这些区域内的文字将在任务中被忽略
⚠️ 注意: 只有处于忽略区域框内部的整个文本块(而非单个字符)会被忽略。
3. 文档识别
支持格式: pdf, xps, epub, mobi, fb2, cbz
- 对扫描件进行OCR,或提取原有文本
- 可输出为双层可搜索PDF
- 支持设定忽略区域(排除页眉页脚)
- 可设置任务完成后自动关机/休眠
4. 扫码(二维码/条形码)
- 支持截图/粘贴/拖入本地图片读取码
- 支持一图多码
- 支持 19种协议:
| 协议类型 | 支持的格式 |
|---|---|
| 线性码 | Codabar, Code128, Code39, Code93, DataBar, DataBarExpanded, EAN13, EAN8, ITF, LinearCodes, UPCA, UPCE |
| 矩阵码 | Aztec, DataMatrix, MatrixCodes, MaxiCode, MicroQRCode, PDF417, QRCode |
5. 生成码
- 输入文本生成二维码图片
- 支持19种协议和纠错等级等参数
6. 全局设置
常用功能:
| 功能 | 说明 |
|---|---|
| 快捷方式 | 一键添加快捷方式或设置开机自启 |
| 界面语言 | 切换繁中、英语、日语等 |
| 界面主题 | 多个亮/暗主题可选 |
| 字体调整 | 调整界面文字的大小和字体 |
| OCR插件 | 切换OCR引擎插件 |
| 渲染器 | 如遇截屏闪烁、UI错位,可切换渲染方案或关闭硬件加速 |
使用建议
如需识别像素超大的长图或大图,请调整:设置 → 文字识别 → 限制图像边长 → 调高数值
部署
[https://hiroi-sora.lanzoul.com/s/umi-ocr]
[https://github.com/hiroi-sora/Umi-OCR/releases/latest]
[https://sourceforge.net/projects/umi-ocr]
目前只有PaddleOCR-json支持Linux,所以docker化了。
因此想构建rapid OCR的docker镜像就需要:
用windows的docker镜像运行rapid ocr
或者用wine在Linux镜像上运行它(效果不明,以及Linux的umi OCR不一定适配)
把rapid OCR json 移植到Linux,并且令umi OCR适配它
## 下载镜像(支持amd64和arm64平台)
docker pull crosscc/umi-ocr:latest --platform linux/amd64
docker pull crosscc/umi-ocr:latest --platform linux/arm64
## 检查cpu指令集
lscpu | grep avx
## 运行
docker run --name umi-ocr --restart=always -e HEADLESS=true -p 8891:1224 -d docker.io/crosscc/umi-ocr:latest
测试
使用图片测试
| 待识别图片 | 生成的二维码图片 |
|---|---|
![]() |
python ocr_test.py
python gen_qrcode_test.py
字符识别代码
import requests
import base64
# 定义OCR服务的URL
ocr_url = "http://127.0.0.1:8891/api/ocr"
# 读取图片文件并转换为base64编码
# image_path = "OCR识别_OK_20250802091323536152.png"
# with open(image_path, "rb") as image_file:
# base64_image = base64.b64encode(image_file.read()).decode("utf-8")
# 不带前缀
base64_image = """
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3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58+bNmzdv3rx58
"""
# 准备请求数据
payload = {
"base64": base64_image,
"options": {
"ocr.angle": False,
"ocr.language": "简体中文",
"tbpu.parser": "multi_para",
"data.format": "dict"
}
}
try:
# 发送POST请求
response = requests.post(ocr_url, json=payload)
response.raise_for_status() # 检查请求是否成功
# 解析响应
result = response.json()
if result["code"] == 100:
print("OCR识别成功!")
print("识别结果:")
print(result["data"])
else:
print(f"OCR识别失败,错误码:{result['code']}")
except requests.exceptions.RequestException as e:
print(f"请求OCR服务时出错: {e}")
except Exception as e:
print(f"处理过程中发生错误: {e}")
二维码生成代码
import requests
import base64
import os
from datetime import datetime
# 定义二维码生成服务的URL
qrcode_url = "http://10.8.8.130:8891/api/qrcode"
# 要生成二维码的文本内容
text_content = "https://github.com/hiroi-sora/Umi-OCR"
# 准备请求数据
payload = {
"text": text_content,
"options": {
"format": "QRCode",
"w": 0, # 0表示自动设为最小宽度
"h": 0, # 0表示自动设为最小高度
"quiet_zone": -1, # -1表示自动调节空白边缘
"ec_level": -1 # -1表示自动纠错等级
}
}
print(f"正在生成二维码...")
print(f"内容: {text_content}")
try:
# 发送POST请求
response = requests.post(qrcode_url, json=payload, timeout=30)
response.raise_for_status() # 检查HTTP请求是否成功
# 解析响应
result = response.json()
print(f"响应代码: {result.get('code')}")
if result.get("code") == 100:
print("二维码生成成功!")
# 获取base64编码的图片数据
base64_image = result.get("data")
print(f"图片base64编码长度: {len(base64_image)} 字符")
# 生成保存文件名(带时间戳)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_path = f"qrcode_{timestamp}.jpg"
# 将base64解码并保存为图片文件
image_data = base64.b64decode(base64_image)
with open(output_path, "wb") as f:
f.write(image_data)
print(f"二维码已保存到: {os.path.abspath(output_path)}")
print(f"文件大小: {len(image_data)} 字节")
else:
print(f"二维码生成失败,错误码:{result.get('code')}")
print(f"错误信息:{result.get('data', '未知错误')}")
except requests.exceptions.Timeout:
print("请求超时,二维码生成服务可能响应过慢")
except requests.exceptions.ConnectionError as e:
print(f"连接错误:无法连接到二维码生成服务 ({qrcode_url})")
print(f"详细错误: {e}")
except requests.exceptions.RequestException as e:
print(f"请求二维码生成服务时出错: {e}")
except Exception as e:
print(f"处理过程中发生错误: {e}")


浙公网安备 33010602011771号