在OCR技术落地过程中,Java开发者常面临"Python生态繁荣,Java集成困难"的困境------要么依赖exe/dll外部文件,要么跨平台部署踩坑不断。如今,JiaJiaOCR 2.0重磅升级,不仅延续CPU推理优势,更新增手写OCR、版面检测、表格检测与识别三大核心功能,模型加载方式也全面优化,实用性再上一个台阶!
一、2.0版本核心升级亮点
相较于1.0版本,JiaJiaOCR 2.0在功能、性能、易用性上实现三重突破,直击更多实际业务场景需求:
-
功能扩容:从"通用"到"全能":在原通用文本识别基础上,新增手写OCR、版面检测、表格检测与识别功能,覆盖印刷体、手写体、文档结构解析全场景;
-
性能优化:模型懒加载更高效:采用功能按需加载模型的懒加载机制,初始化时无需加载所有模型,降低内存占用,启动速度提升40%;
-
体验升级:结果输出更丰富:除原有文本内容与坐标外,新增版面元素坐标、表格识别HTML格式输出,直接支持结构化数据提取;
-
兼容性不变:跨平台无依赖:全程纯Java实现,无需调用exe/dll,完美兼容Windows、Linux x86环境,JDK8+即可运行。
二、四大核心功能详解
JiaJiaOCR 2.0以"全场景文本解析"为核心,四大功能覆盖从单字识别到文档结构化的完整需求:
1. 通用OCR:印刷体识别标杆
延续1.0版本的高精度印刷体识别能力,支持中英文、数字、符号混合识别,返回文本内容与坐标,适用于发票、标签、广告牌等印刷体场景。
2. 手写OCR:突破手写识别难点
新增针对中文手写体的专项优化模型,支持工整手写、连笔手写等常见手写风格,解决手写笔记数字化、手写表单录入等痛点,识别准确率达92%以上(标准手写样本测试)。
3. 版面检测:文档结构智能解析
可自动识别文档中的标题、段落、图片、表格等版面元素,返回各元素的坐标与类型标签,为文档结构化处理提供基础,适用于PDF转Word、古籍数字化等场景。
4. 表格检测与识别:结构化数据直接提取
业内少有的纯Java表格识别方案,支持表格区域检测、单元格分割、内容识别全流程,最终输出HTML格式的结构化结果,可直接渲染为表格或导入Excel,彻底告别手动录入表格数据的繁琐。





三、快速上手:5分钟集成教程
1. 环境准备
-
开发环境:JDK 8及以上版本;
-
运行环境:Windows 10+、Linux x86_64;
-
依赖:Maven(推荐)。
2. 引入依赖与Jar包
第一步:在pom.xml中添加以下依赖(深度学习引擎与图像处理依赖):
java
<dependencies>
<!-- ONNX Runtime:模型推理核心依赖 -->
<dependency>
<groupId>com.microsoft.onnxruntime</groupId>
<artifactId>onnxruntime</artifactId>
<version>1.19.0</version>
</dependency>
<!-- DJL MXNet引擎:深度学习框架支持 -->
<dependency>
<groupId>ai.djl.mxnet</groupId>
<artifactId>mxnet-engine</artifactId>
<version>0.31.0</version>
</dependency>
<!-- OpenCV:图像处理依赖 -->
<dependency>
<groupId>ai.djl.opencv</groupId>
<artifactId>opencv</artifactId>
<version>0.31.0</version>
</dependency>
<!-- DJL核心API:模型管理 -->
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.31.0</version>
</dependency>
</dependencies>
第二步:下载核心Jar包:
前往GitHub仓库https://github.com/jiangnanboy/JiaJiaOCR的`releases`页面,下载**JiaJiaOCR 2.0**版本的jar包,放入项目依赖目录并引入,这个Jar包200MB,因为集成了模型。
3. 完整功能示例代码
以下代码包含2.0版本所有核心功能的调用示例,注释清晰可直接复制使用,需将imgPath替换为实际图片路径:
java
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.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
public class JiaJiaOCR2Demo {
public static void main(String...args) {
String imgPath = "test.jpg"; // 替换为你的图片路径
// 按需解锁功能(注释解开即可使用)
// generalOCRTest(imgPath); // 1.通用OCR(印刷体)
// handwrittingOCRTest(imgPath); // 2.手写OCR
// layoutDetTest(imgPath); // 3.版面检测(带可视化)
// tableDetTest(imgPath); // 4.表格检测(带可视化)
// tableRecTest(imgPath); // 5.表格识别(输出HTML)
// tableDetRecTest(imgPath); // 6.表格检测+识别(一站式)
// textLineDetText(imgPath); // 7.文本行检测(带可视化)
}
/**
* 1. 通用OCR(印刷体识别)
* @param imgPath 图片路径
*/
public static void generalOCRTest(String imgPath) {
// 懒加载初始化:此时不加载任何模型
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
// 调用功能时才加载对应模型
List<Pair<Text, Box>> result = jiaJiaOCR.recognizeGeneralText(imgPath);
// 输出:文本内容+四边形坐标
System.out.println("通用OCR结果:" + result);
}
/**
* 2. 手写OCR识别
* @param imgPath 图片路径
*/
public static void handwrittingOCRTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<Pair<Text, Box>> result = jiaJiaOCR.recognizeHandwrittenText(imgPath);
System.out.println("手写OCR结果:" + result);
}
/**
* 3. 版面检测(识别标题/段落/表格等元素,带可视化)
* @param imgPath 图片路径
*/
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);
}
/**
* 4. 表格检测(仅检测表格区域,带可视化)
* @param imgPath 图片路径
*/
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);
}
/**
* 5. 表格识别(基于通用OCR结果提取表格结构,输出HTML)
* @param imgPath 图片路径
*/
public static void tableRecTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
// 先获取通用OCR结果
List<Pair<Text, Box>> ocrResult = jiaJiaOCR.recognizeGeneralText(imgPath);
// 基于OCR结果提取表格结构
TableResult tableResult = jiaJiaOCR.recognizeTableFromOCR(imgPath, ocrResult);
// 输出HTML格式(可直接渲染)
System.out.println("表格识别HTML结果:" + tableResult.getHtmlContent());
}
/**
* 6. 表格检测+识别一站式调用
* @param imgPath 图片路径
*/
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());
}
}
/**
* 7. 文本行检测(带可视化)
* @param imgPath 图片路径
*/
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 drawLayoutPredictions(Mat img, List<Layout> detLayout) {
for(Layout layout : detLayout) {
int[] bbox = layout.getBbox();
// 绘制矩形框(红色,线宽2)
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]);
// 绘制多边形(红色,线宽1)
MatOfPoint polygon = new MatOfPoint(points);
List<MatOfPoint> polygons = new ArrayList<>();
polygons.add(polygon);
Imgproc.polylines(img, polygons, true, new Scalar(0, 0, 255), 1);
}
}
}
四、关键返回结果说明
JiaJiaOCR 2.0提供结构化、易解析的返回结果,覆盖不同功能场景需求:
| 功能模块 | 核心返回内容 | 数据格式说明 |
|---|---|---|
| 通用OCR/手写OCR | 文本内容、坐标、置信度 | List<Pair<Text, Box>>,Text含内容与置信度,Box含8个顶点坐标 |
| 版面检测 | 元素类型、坐标、置信度 | List<Layout>,含label(标题/段落等)、bbox(矩形坐标) |
| 表格检测 | 表格区域、置信度 | List<DetectionResult>,含矩形坐标与置信度 |
| 表格识别 | 表格结构、内容、坐标 | TableResult,含htmlContent(HTML格式)、box(坐标) |
五、典型应用场景
凭借全功能覆盖与纯Java优势,JiaJiaOCR 2.0可广泛落地于以下场景:
-
企业文档管理系统:结合版面检测与OCR,实现合同、报表的结构化解析与检索;
-
教育信息化平台:通过手写OCR识别学生作业、试卷中的手写答案,辅助自动批改;
-
金融票据处理:识别发票、单据中的印刷体内容与表格数据,自动录入财务系统;
-
政务办公系统:解析各类政务表单的版面结构与填写内容,实现无纸化办公;
-
工业质检场景:识别生产线上产品标签的印刷体文字,实现质量追溯。
六、获取与交流方式
JiaJiaOCR开源库免费使用,欢迎Java开发者体验与反馈问题:
-
版本下载 :GitHub仓库
releases页面下载JiaJiaOCR 2.0 Jar包; -
问题反馈:通过GitHub Issues提交bug或需求;
写在最后
JiaJiaOCR 2.0的升级核心,是从"解决Java开发者OCR集成痛点"到"提供全场景文本解析能力"的跨越。纯Java实现保障了跨平台部署的便捷性,新增的手写OCR与表格识别功能则直击实际业务中的高频需求。
如果你正在为Java项目寻找轻量、高效、无依赖的OCR解决方案,不妨试试JiaJiaOCR 2.0------5分钟集成,一站式覆盖从印刷体到手写体、从文本识别到表格结构化的全需求。期待你的使用反馈,也欢迎一起讨论,让Java OCR生态更加强大!
温馨提示:首次使用建议先运行示例代码,确认依赖与Jar包引入正确;如有问题请联系我。