又找到一个纯Java的OCR项目,识别的格式还挺多

0 阅读3分钟

01 引言

前两天分享一个**RapidOCR**的项目,今天又发现一款OCR项目,Python零依赖,纯Java项目, 不用GPU也能跑,这不就是为我们这种 Java 后端量身定做的吗Java后端调用OCR又多了一份选择!

02 简介

JiaJiaOCR 是一个纯 Java 的 OCR 引擎,在通用文字识别基础上,新增了手写 OCR、版面检测、表格检测与识别,覆盖印刷体 / 手写体 / 文档结构解析全场景。

它的核心优势:

  • 纯 Java:没有 JNI、没有 EXE/DLL、不需要 Python 运行时,一个 JAR 全搞定,直接 Maven 引就能进 Spring 项目。
  • CPU 优先:官方明确「推荐 CPU」,不依赖 GPU/CUDA,普通服务器就能跑,部署成本极低。
  • 跨平台 + 信创:支持 x86_64 和 ARM,覆盖 Windows / Linux / macOS,还能跑在麒麟、UOS 等国产系统上。
  • 懒加载:模型按需加载,用到哪个功能才加载哪个,启动快、内存省。
  • 模型内嵌:模型直接打进 JAR 里,开箱即用;也能用 -Djiajia.model.dir 指定外部模型目录(支持热更新)。
  • 线程安全:单个实例可并发批量识别,多线程共享一个就够了。

GitHub 地址:github.com/jiangnanboy…

03 安装

JiaJiaOCR该项目没有上传到中央仓库,需要我们自行构建。

3.1 构建

mvn clean package -DskipTests

3.2 引入辅助依赖

在 pom.xml 里加这几个核心依赖(pdfbox 仅 PDF 识别才需要):

<dependencies>
    <dependency>
        <groupId>com.microsoft.onnxruntime</groupId>
        <artifactId>onnxruntime</artifactId>
        <version>1.19.0</version>
    </dependency>
    <dependency>
        <groupId>org.openpnp</groupId>
        <artifactId>opencv</artifactId>
        <version>4.9.0-0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>3.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.17.0</version>
    </dependency>
</dependencies>

3.3 需要加载模型

https://github.com/jiangnanboy/JiaJiaOCR/releases/tag/models下放了需要模型,我们需要提前下载下来。

可以只放到项目的classpath下的models。

04 测试

JiaJiaOCR提供了多种识别方式:

  • 通用识别:中英文 / 数字 / 符号混排,返回文本、置信度、8 点坐标。
  • 手写识别:专为中文手写优化,标准数据集 92%+ 准确率,比 Tesseract 的手写能力强太多。
  • 文本行检测:只定位文本行位置(不识别内容),方便做版面预处理。
  • 版面检测:识别标题、段落、图片、表格并给出坐标
  • 表格检测:定位表格区域 + 置信度。
  • 表格识别:解析表结构为 HTML + 结构化 JSON(行列级),直接对接你后端的表单 / 入库逻辑。
  • PDF 识别:多页 PDF 自动转图后批量 OCR。
  • 任务取消:长任务可传 CancellationToken,另一个线程调 cancel() 中断。
  • 多线程批量:单个实例预热后,多线程并发调用共享实例即可,无需每线程 new 一个。

我们使用通用识别测一个就好了:

public class TestjiajiaOcr {

    String imagePath = "src/main/images/u.jpeg";

    @Test
    void test01() throws OrtException {
        try (JiaJiaOCR ocr = JiaJiaOCR.builder()) {
            List<Pair<Text, Box>> results = ocr.recognizeGeneralText(imagePath);
            String content = "";
            for (Pair<Text, Box> item : results) {
                content += item.getLeft().getText();
            }
            System.out.println(content);
        }
    }
}

识别目标:

识别结果:

GitHub上提啊提供了其他案例,感兴趣的老铁可以去测试。

05 小结

JiaJiaOCR给纯 Java 团队提供了另一种OCR选择,虽然在GitHub上的star数只有105,不妨碍它为我们提供的可使用的工具。