基于Java实现OCR 文字识别的两种方案

 更新时间:2025年12月09日 09:26:47   作者:xienda  
OCR技术已广泛应用于图文转换、证件识别、票据处理等场景,作为 Java 开发者,如何快速实现 OCR 功能?本文将介绍两种常用方案,帮助你快速上手 Java OCR 开发,需要的朋友可以参考下

引言

OCR(Optical Character Recognition,光学字符识别)技术已广泛应用于图文转换、证件识别、票据处理等场景。作为 Java 开发者,如何快速实现 OCR 功能?本文将介绍两种常用方案:基于 Tesseract 的本地 OCR 引擎调用,以及基于百度 AI 开放平台的 OCR 接口调用,帮助你快速上手 Java OCR 开发。

方案一:本地 Tesseract OCR 引擎(离线识别)

Tesseract 是谷歌开源的 OCR 引擎,支持多语言识别,适合离线场景。Java 中可通过tess4j库简化调用。

1. 环境准备

步骤 1:安装 Tesseract 引擎

  • Windows:从 UB-Mannheim/tesseract 下载安装包,勾选 "Add to PATH"。
  • Linux:执行 sudo apt install tesseract-ocr
  • 验证:终端输入 tesseract --version,显示版本信息则安装成功。

步骤 2:下载语言包

Tesseract 默认支持英文,中文需额外下载语言包:

  • 从 tessdata 下载 chi_sim.traineddata(简体中文)。
  • 将语言包放入 Tesseract 安装目录的 tessdata 文件夹(如 C:\Program Files\Tesseract-OCR\tessdata)。

步骤 3:引入 Maven 依赖

pom.xml中添加tess4j依赖(封装了 Tesseract 的 Java 调用):

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>5.1.0</version>
</dependency>

2. 代码实现(本地识别)

核心逻辑:通过tess4j加载图片,指定语言包,调用识别接口。

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;

public class LocalOcrDemo {
    public static void main(String[] args) {
        // 1. 创建Tesseract实例
        ITesseract tesseract = new Tesseract();
        
        // 2. 配置语言包路径(默认会读取系统环境变量中的TESSDATA_PREFIX)
        // 若识别失败,可手动指定路径:tesseract.setDatapath("C:\\Program Files\\Tesseract-OCR\\tessdata");
        
        // 3. 设置识别语言(英文+中文,多个语言用+分隔)
        tesseract.setLanguage("eng+chi_sim");
        
        try {
            // 4. 识别图片(支持jpg、png、gif等格式)
            File imageFile = new File("test.png"); // 待识别的图片路径
            String result = tesseract.doOCR(imageFile);
            
            // 5. 输出识别结果
            System.out.println("识别结果:\n" + result);
        } catch (TesseractException e) {
            System.err.println("识别失败:" + e.getMessage());
        }
    }
}

3. 优化建议

  • 图片预处理:识别精度受图片质量影响,建议先对图片进行灰度化、降噪、放大处理(可使用Java ImageIOOpenCV实现)。
  • 自定义训练:对特定场景(如验证码、票据),可通过 Tesseract 训练工具生成专属语言包,提升精度。

方案二:百度 AI OCR 接口(在线识别)

百度 AI 开放平台提供了免费的 OCR 接口,支持通用文字、身份证、银行卡等场景,精度高于本地引擎,但需联网且有调用限制(免费额度:通用文字识别 500 次 / 天)。

1. 环境准备

步骤 1:获取 API 密钥

步骤 2:引入 SDK 依赖

百度提供了 Java SDK,简化接口调用:

<dependency>
    <groupId>com.baidu.aip</groupId>
    <artifactId>java-sdk</artifactId>
    <version>4.16.14</version>
</dependency>

2. 代码实现(API 调用)

核心逻辑:通过 SDK 获取访问令牌(AccessToken),调用通用文字识别接口。

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.HashMap;

public class BaiduOcrDemo {
    // 替换为你的API Key和Secret Key
    private static final String APP_ID = "你的APP_ID";
    private static final String API_KEY = "你的API_KEY";
    private static final String SECRET_KEY = "你的SECRET_KEY";

    public static void main(String[] args) {
        // 1. 初始化客户端
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
        
        // 2. 可选:设置网络参数(超时时间、重试次数等)
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
        
        // 3. 调用通用文字识别(高精度版)
        HashMap<String, String> options = new HashMap<>();
        options.put("language_type", "CHN_ENG"); // 中英文混合
        options.put("detect_direction", "true"); // 检测方向
        
        // 图片路径或二进制数据(本地图片用getPath,网络图片需先下载)
        String imagePath = "test.png";
        JSONObject response = client.basicAccurateGeneral(imagePath, options);
        
        // 4. 解析响应结果
        parseResult(response);
    }

    // 解析JSON结果,提取识别文字
    private static void parseResult(JSONObject response) {
        if (response.has("words_result")) {
            JSONArray wordsArray = response.getJSONArray("words_result");
            System.out.println("识别结果:");
            for (int i = 0; i < wordsArray.length(); i++) {
                JSONObject wordObj = wordsArray.getJSONObject(i);
                System.out.println(wordObj.getString("words"));
            }
        } else {
            System.err.println("识别失败:" + response.toString());
        }
    }
}

3. 接口说明

百度 OCR 提供多种接口,根据场景选择:

  • basicGeneral:通用文字识别(快速版)
  • basicAccurateGeneral:通用文字识别(高精度版)
  • idcard:身份证识别
  • bankcard:银行卡识别

免费额度可在百度 AI 控制台查看,超出需付费。

两种方案对比

维度本地 Tesseract百度 AI OCR
网络依赖离线可用必须联网
识别精度依赖图片质量和语言包高(基于深度学习模型)
调用限制免费额度有限制
定制化可训练专属模型不可定制,依赖平台能力
适用场景离线、低频次、简单场景在线、高频次、高精度需求

注意事项

本地 Tesseract

  • 语言包必须与 Tesseract 版本兼容(建议使用最新版)。
  • 中文识别时,图片文字需清晰(避免艺术字、模糊字体)。

百度 AI OCR

  • APP_ID等密钥需妥善保管,避免泄露。
  • 大图片建议先压缩(接口限制单张图片≤4MB)。

总结

本文介绍了 Java 实现 OCR 的两种主流方案:本地 Tesseract 适合离线场景,百度 AI OCR 适合对精度要求高的在线场景。实际开发中可根据需求选择,也可结合两者(离线优先,失败时调用 API 兜底)。

以上就是基于Java实现OCR 文字识别的两种方案的详细内容,更多关于Java OCR 文字识别的资料请关注脚本之家其它相关文章!

相关文章

  • HashMap每次扩容为什么是2倍

    HashMap每次扩容为什么是2倍

    当HashMap在初始化没有指定容量的情况下,首次添加元素时,数组的容量为16;当超出阈值,数组容量为扩容为之前的2倍,为什么HashMap每次扩容都是之前的2倍?下面就介绍一下
    2024-11-11
  • Mybatis防止sql注入的实例

    Mybatis防止sql注入的实例

    本文通过实例给大家介绍了Mybatis防止sql注入的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • SpringBoot实现应用开机自启动与进程守护配置方案

    SpringBoot实现应用开机自启动与进程守护配置方案

    机房意外断电,恢复供电后所有服务器重启,但SpringBoot应用没有自动启动,事后排查发现,没有留下开机自启动配置文档,所以本文整理了两套SpringBoot应用开机自启动与进程守护方案,需要的朋友可以参考下
    2025-07-07
  • Java发送SNMP至交换机获取交换机状态实现方式

    Java发送SNMP至交换机获取交换机状态实现方式

    文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v3的安全性差异,并说明通过PDU封装请求及GETBULK操作提升数据获取效率
    2025-09-09
  • SpringBoot中4种数据水平分片策略

    SpringBoot中4种数据水平分片策略

    数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧
    2025-06-06
  • ArrayList和JSONArray边遍历边删除到底该如何做

    ArrayList和JSONArray边遍历边删除到底该如何做

    这篇文章主要介绍了ArrayList和JSONArray边遍历边删除到底该如何做,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java启动时自定义配置文件路径,自定义log4j2.xml位置方式

    java启动时自定义配置文件路径,自定义log4j2.xml位置方式

    这篇文章主要介绍了java启动时自定义配置文件路径,自定义log4j2.xml位置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 详解Java Ajax jsonp 跨域请求

    详解Java Ajax jsonp 跨域请求

    本篇文章主要介绍了详解Java Ajax jsonp 跨域请求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • idea版本控制忽略.idea文件和.iml文件的问题

    idea版本控制忽略.idea文件和.iml文件的问题

    这篇文章主要介绍了idea版本控制忽略.idea文件和.iml文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 基于Java语言实现Socket通信的实例

    基于Java语言实现Socket通信的实例

    今天小编就为大家分享一篇关于基于Java语言实现Socket通信的实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论