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)

特点:

  • ✅ 支持文本后处理功能
  • ✅ 无数量上限,可一次性导入几百张图片
  • ✅ 支持任务完成后自动关机/待机
  • ⚠️ 识别超大长图时,请调整:设置→文字识别→限制图像边长→调高数值

特殊功能:忽略区域

用于排除图片中不想要的文字(如水印)。

使用方法:

  1. 在批量识别页右栏设置中进入忽略区域编辑器
  2. 按住右键,绘制多个矩形框包裹水印区域
  3. 这些区域内的文字将在任务中被忽略

⚠️ 注意: 只有处于忽略区域框内部的整个文本块(而非单个字符)会被忽略。


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

测试

使用图片测试

待识别图片 生成的二维码图片
截屏2026-04-12 08.50 qrcode_20260412_095027
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}")
posted @ 2026-04-12 10:38  qsBye  阅读(19)  评论(0)    收藏  举报