跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava算法

JiaJiaOCR:Java 开源 OCR 识别库

JiaJiaOCR 是一个面向 Java 开发者的开源 OCR 库,解决 Java 集成困难问题。提供轻量版与全功能版,支持通用 OCR、手写 OCR、版面检测及表格识别。通过 Maven 引入依赖,支持 ONNX Runtime 与 DJL 引擎。具备懒加载机制,可处理 PDF、图片等多种格式,返回结构化文本与坐标数据。

Ne0发布于 2026/3/29更新于 2026/10/22110 浏览

JiaJiaOCR:Java 开源 OCR 识别库

在 OCR 技术落地过程中,Java 开发者常面临 Python 生态繁荣但 Java 集成困难的困境。JiaJiaOCR 提供轻量级和全功能版本,支持通用 OCR、手写 OCR、版面检测及表格识别。

版本说明

版本大小核心功能适用场景
轻量版 (1.0+)21MB+通用 OCR 识别快速集成、资源受限环境
全功能版 (2.0+)200MB+通用 OCR+ 手写 OCR+ 版面检测 + 表格识别企业级应用、复杂文档处理

版本更新

轻量版 (1.0+)

  • v1.0.1: 优化英文 OCR 空白识别,返回空串而非 null
  • v1.0.2: 新增 PDF 识别支持

全功能版 (2.0+)

  • v2.0.1: 优化英文 OCR 空白识别,返回空串而非 null
  • v2.0.2: 新增 PDF 识别支持
  • 性能提升:模型懒加载机制,按需加载
  • 功能扩容:新增手写 OCR、版面检测、表格检测与识别
  • 结果升级:新增版面元素坐标、表格 HTML 格式输出

核心功能

  1. 通用 OCR:支持中英文、数字、符号混合识别,适用于发票、标签等印刷体场景。
  2. 手写 OCR:针对中文手写体专项优化,支持工整及连笔手写,识别准确率达 92% 以上。
  3. 版面检测:自动识别标题、段落、图片、表格等元素,返回坐标与类型标签。
  4. 表格检测与识别:纯 Java 表格识别方案,支持区域检测、单元格分割,输出 HTML 格式结构化结果。

快速上手

环境准备

  • 开发环境:JDK 8 及以上
  • 运行环境:Windows 10+、Linux x86_64
  • 依赖管理:Maven

引入依赖

Maven 依赖
<dependencies>
    <dependency>
        <groupId>com.microsoft.onnxruntime</groupId>
        <artifactId>onnxruntime</artifactId>
        <version>1.19.0</version>
    </dependency>
    <dependency>
        <groupId>ai.djl.mxnet</groupId>
        <artifactId>mxnet-engine</artifactId>
        <version>0.31.0</version>
    </dependency>
    <dependency>
        <groupId>ai.djl.opencv</groupId>
        <artifactId>opencv</artifactId>
        <version>0.31.0</version>
    </dependency>
    <dependency>
        <groupId>ai.djl</groupId>
        <artifactId>api</artifactId>
        <version>0.31.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>3.0.2</version>
    </dependency>
</dependencies>
下载 Jar 包

前往 GitHub 仓库 releases 页面下载 JiaJiaOCR jar 包并放入项目依赖目录。该 Jar 包集成了模型文件。

代码示例

import com.jiajia.common_object.*;
import com.jiajia.core.JiaJiaOCR;
import org.apache.commons.lang3.tuple.Pair;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
import static com.jiajia.common_object.PdfConvert.convertPdfToImages;

public class JiaJiaOCR2Demo {
    public static void main(String... args) {
        String imgPath = "test.jpg";
        // generalOCRTest(imgPath);
        // handwrittingOCRTest(imgPath);
        // layoutDetTest(imgPath);
        // tableDetTest(imgPath);
        // tableRecTest(imgPath);
        // tableDetRecTest(imgPath);
        // textLineDetText(imgPath);
        // pdfOCR();
    }

    public static void generalOCRTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<Pair<Text, Box>> result = jiaJiaOCR.recognizeGeneralText(imgPath);
        System.out.println("通用 OCR 结果:" + result);
    }

    public static void handwrittingOCRTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<Pair<Text, Box>> result = jiaJiaOCR.recognizeHandwrittenText(imgPath);
        System.out.println("手写 OCR 结果:" + result);
    }

    public static void layoutDetTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<Layout> layoutList = jiaJiaOCR.detectLayout(imgPath);
        Mat img = Imgcodecs.imread(imgPath);
        drawLayoutPredictions(img, layoutList);
        Imgcodecs.imwrite("layout_result.jpg", img);
        System.out.println("版面检测结果已保存:" + layoutList);
    }

    public static void tableDetTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<DetectionResult> tableList = jiaJiaOCR.detectTables(imgPath);
        Mat img = Imgcodecs.imread(imgPath);
        Mat resultMat = drawTableResults(img, tableList);
        Imgcodecs.imwrite("table_detect_result.jpg", resultMat);
        System.out.println("表格检测区域:" + tableList);
    }

    public static void tableRecTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<Pair<Text, Box>> ocrResult = jiaJiaOCR.recognizeGeneralText(imgPath);
        TableResult tableResult = jiaJiaOCR.recognizeTableFromOCR(imgPath, ocrResult);
        System.out.println("表格识别 HTML 结果:" + tableResult.getHtmlContent());
    }

    public static void tableDetRecTest(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<TableResult> tableResults = jiaJiaOCR.recognizeTables(imgPath);
        for (TableResult table : tableResults) {
            System.out.println("表格 HTML:" + table.getHtmlContent());
            System.out.println("表格坐标:" + table.getBox());
        }
    }

    public static void textLineDetText(String imgPath) {
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        Boxes textLines = jiaJiaOCR.detectTextLines(imgPath);
        Mat img = Imgcodecs.imread(imgPath);
        drawTextLinePredictions(img, textLines);
        Imgcodecs.imwrite("textline_result.jpg", img);
        System.out.println("文本行检测结果:" + textLines);
    }

    public static void pdfOCR() throws IOException, OrtException {
        String pdfPath = "How_To.pdf";
        String pdfOutputDir = "pdf_image";
        JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
        List<String> pdfPathList = convertPdfToImages(pdfPath, pdfOutputDir);
        for (String pdfImgPath : pdfPathList) {
            List<Pair<Text, Box>> pairList = jiaJiaOCR.recognizeGeneralText(pdfImgPath);
            System.out.println(pairList);
        }
    }

    public static void drawLayoutPredictions(Mat img, List<Layout> detLayout) {
        for (Layout layout : detLayout) {
            int[] bbox = layout.getBbox();
            Imgproc.rectangle(img, new Point(bbox[0], bbox[1]), new Point(bbox[2], bbox[3]), new Scalar(0, 0, 255), 2);
            String label = layout.getLabel();
            Imgproc.putText(img, label, new Point(bbox[0] + 5, bbox[1] - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(0, 255, 0), 2);
        }
    }

    public static Mat drawTableResults(Mat image, List<DetectionResult> results) {
        Mat resultImg = image.clone();
        for (DetectionResult result : results) {
            String label = "表格:" + String.format("%.2f", result.getConfidence());
            Imgproc.putText(resultImg, label, new Point(result.getRect().x, result.getRect().y - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(0, 0, 255), 2);
            Imgproc.rectangle(resultImg, new Point(result.getRect().x, result.getRect().y), new Point(result.getRect().x + result.getRect().width, result.getRect().y + result.getRect().height), new Scalar(0, 0, 255), 2);
        }
        return resultImg;
    }

    public static void drawTextLinePredictions(Mat img, Boxes detBoxes) {
        List<Box> boxList = detBoxes.getBoxes();
        for (Box box : boxList) {
            double[] pos = box.getLinePosition();
            Point[] points = new Point[4];
            points[0] = new Point(pos[0], pos[1]);
            points[1] = new Point(pos[2], pos[3]);
            points[2] = new Point(pos[4], pos[5]);
            points[3] = new Point(pos[6], pos[7]);
            MatOfPoint polygon = new MatOfPoint(points);
            List<MatOfPoint> polygons = new ArrayList<>();
            polygons.add(polygon);
            Imgproc.polylines(img, polygons, true, new Scalar(0, 0, 255), 1);
        }
    }
}

关键返回结果

功能模块核心返回内容数据格式说明
通用 OCR / 手写 OCR文本内容、坐标、置信度List<Pair<Text, Box>>
版面检测元素类型、坐标、置信度List
表格检测表格区域、置信度List
表格识别表格结构、内容、坐标TableResult

效果展示

通用 OCR 效果

文章配图

手写 OCR 效果

文章配图

版面检测效果

文章配图

表格检测效果

文章配图

表格识别效果

文章配图

目录

  1. JiaJiaOCR:Java 开源 OCR 识别库
  2. 版本说明
  3. 版本更新
  4. 核心功能
  5. 快速上手
  6. 环境准备
  7. 引入依赖
  8. Maven 依赖
  9. 下载 Jar 包
  10. 代码示例
  11. 关键返回结果
  12. 效果展示
  13. 通用 OCR 效果
  14. 手写 OCR 效果
  15. 版面检测效果
  16. 表格检测效果
  17. 表格识别效果

更多推荐文章

查看全部
  • 基于 Docker 部署 PDFMathTranslate 实现数学文档翻译
  • Android 开发现状分析与中高级技术进阶路线
  • 构建 AI 临床副驾驶:基于 Go 的电子病历智能助手与 HIS 对接实战
  • 字节跳动 AI 产品经理三轮面试经验与通用问题解析
  • HDFS 核心组件深度解析:分布式文件系统架构基石
  • C++反向迭代器实现与逆波兰表达式计算器
  • 命令行工具 MCPHost:让大模型通过协议调用外部工具
  • JDBC 连接 MySQL 数据库时 SSL 连接警告的处理方法
  • Java 线程池线程数配置:IO、CPU 与混合型任务分析
  • 基于 OpenClaw 整合 Qlib 与 RD-Agent 构建 AI 量化系统
  • LLaMA 与 GPT-4 为何青睐 RMSNorm?轻量级归一化三大优势解析
  • CoPaw Windows 安装与应用实战指南
  • 基于 Java 和 GeoTools 根据矢量 BBox 自动生成格网文件
  • 在线图书借阅平台设计与实现:基于飞算 JavaAI
  • 前端状态管理方案对比:Redux Toolkit、Zustand 与 Jotai
  • Rust 异步并发安全与内存管理的最佳实践
  • whisperX 入门指南:从安装到实现语音识别功能
  • C++ 实现 Wishart 分布样本矩阵生成
  • llama.cpp本地部署性能调优指南:从启动瓶颈到推理效率优化
  • 基于 ResNet50 与 TensorFlow 的宠物识别系统

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online