51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

基于 Spring Boot3.3 + OCR 实现图片转文字功能

基于 Spring Boot3.3 + EasyOCR 实现图片转文字功能

在当今数字化信息时代,图像中的文字信息越来越重要,无论是文档扫描、名片识别,还是车辆牌照的识别,OCR(Optical Character Recognition,光学字符识别)技术都在各个领域发挥着关键作用。本文将介绍如何基于 Spring Boot 框架集成 EasyOCR,实现图片转文字的功能。我们将通过实际的代码示例,详细讲解从前端上传图片、后端处理到最终文字识别的全过程。

运行效果:

识别效果:

若想获取项目完整代码以及其他文章的项目源码,且在代码编写时遇到问题需要咨询交流,欢迎加入下方的知识星球。

什么是 OCR?

OCR 是一种将图片中的印刷体或手写文本转换为可编辑文本的技术。它广泛应用于文档管理系统、车牌识别、票据处理、身份证识别等领域。传统的 OCR 解决方案通常基于复杂的机器学习算法,需进行大量的数据训练。然而,随着深度学习的快速发展,出现了一些更加灵活且易于使用的 OCR 框架,其中 EasyOCR 就是一个突出的代表。

EasyOCR 框架简介

EasyOCR 简介

EasyOCR 是一个由 Jaided AI 开发的开源 OCR 解决方案。它基于 PyTorch 深度学习框架,具有开箱即用、易于集成、支持多语言等特点。与传统的 OCR 工具相比,EasyOCR 不仅识别速度快,还能处理各种复杂的文本图像,如弯曲的文本、不同字体、各种语言混合的文本等。

EasyOCR 的特性

  • 多语言支持:EasyOCR 支持 80 多种语言,包括中英双语、日语、韩语、阿拉伯语等,特别适合需要处理多语言文本的场景。

  • 开源免费:EasyOCR 完全开源,并且在 GitHub 上持续维护和更新,开发者可以免费使用并进行二次开发。

  • 易于集成:只需简单几行代码,即可将 EasyOCR 集成到现有项目中。其 API 设计简单明了,非常适合快速开发和部署。

  • 高准确率:基于深度学习的模型,EasyOCR 在复杂场景下的文本识别准确率较高,能够应对弯曲文本、复杂背景等难题。

  • 轻量级:与其他基于深度学习的 OCR 解决方案相比,EasyOCR 更加轻量级,占用资源少,适合嵌入式设备和服务器应用。

环境准备

  1. Python 环境:EasyOCR 是基于 Python 的,因此需要在系统中安装 Python。

  2. EasyOCR 安装:使用 pip 安装 EasyOCR。

    pip install easyocr

Spring Boot 项目:我们将创建一个 Spring Boot 项目,并通过 HTTP 请求将图片传递给 Python 脚本进行 OCR 处理。

项目结构

easyocr
|-- src
|   |-- main
|       |-- java
|           |-- com
|               |-- icoderoad
|                   |-- easyocr
|                       |-- EasyOcrApplication.java
|                       |-- controller
|                           |-- OcrController.java
|-- resources
|   |-- application.yml
|-- pom.xml
|-- ocr_script.py

Python OCR 脚本

首先,我们编写一个 Python 脚本 ocr_script.py,用于接收图像文件并使用 EasyOCR 进行文字识别。

import easyocr
import sys

def extract_text_from_image(image_path):
    # 初始化 EasyOCR Reader,支持中文和英文
    reader = easyocr.Reader(['ch_sim', 'en'])  # 'ch_sim' 用于简体中文,'ch_tra' 用于繁体中文
    results = reader.readtext(image_path)
    
    text = ""
    for result in results:
        text += result[1] + "\n"
    return text

if __name__ == "__main__":
    image_path = sys.argv[1]  # 从命令行参数获取图片路径
    text = extract_text_from_image(image_path)
    print(text)  # 输出识别结果

Spring Boot 配置

pom.xml 配置

添加 spring-boot-starter-webcommons-io 依赖,用于创建 REST API 和处理文件操作。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
</dependencies>

application.yml 配置

配置文件上传的临时存储路径。

server:
  port: 8080
  
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
      
ocr:
  python-path: /path/python/bin/python
  script-path: /path/to/ocr_script.py
  upload-dir: /tmp/uploads/

EasyOcrApplication.java

Spring Boot 启动类。

package com.icoderoad.easyocr;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EasyocrApplication {

	public static void main(String[] args) {
		SpringApplication.run(EasyocrApplication.class, args);
	}

}

创建配置类

使用 @ConfigurationProperties 注解创建一个配置类,以便将 YAML 文件中的配置注入到 Spring Boot 应用中。

OcrProperties.java

package com.icoderoad.easyocr.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "ocr")
public class OcrProperties {

    private String pythonPath;
    private String scriptPath;
    private String uploadDir;
    

    public String getPythonPath() {
		return pythonPath;
	}

	public void setPythonPath(String pythonPath) {
		this.pythonPath = pythonPath;
	}

	public String getScriptPath() {
        return scriptPath;
    }

    public void setScriptPath(String scriptPath) {
        this.scriptPath = scriptPath;
    }

    public String getUploadDir() {
        return uploadDir;
    }

    public void setUploadDir(String uploadDir) {
        this.uploadDir = uploadDir;
    }
}

OcrController.java

控制器用于处理文件上传和调用 Python 脚本。

package com.icoderoad.easyocr.controller;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.icoderoad.easyocr.config.OcrProperties;

@RestController
@RequestMapping("/api/ocr")
public class OcrController {

    @Autowired
    private OcrProperties ocrProperties;

    @PostMapping("/extract")
    public String extractText(@RequestParam("file") MultipartFile file) {
        try {
            // 保存上传的文件
            File tempFile = new File(ocrProperties.getUploadDir() + file.getOriginalFilename());
            FileUtils.writeByteArrayToFile(tempFile, file.getBytes());

            // 调用 Python 脚本
            ProcessBuilder processBuilder = new ProcessBuilder(ocrProperties.getPythonPath(), ocrProperties.getScriptPath(), tempFile.getAbsolutePath());
            Process process = processBuilder.start();
            process.waitFor();

            // 读取输出
            String output = new String(process.getInputStream().readAllBytes());
            return output;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            return "OCR 识别失败";
        }
    }
}

前端示例

使用 Thymeleaf 模板、Bootstrap 和 JavaScript 创建一个简单的前端页面,允许用户上传图片并查看 OCR 结果。

src/main/resources/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OCR 图片识别</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h1 class="mt-5">OCR 图片识别</h1>
        <form id="uploadForm">
            <div class="form-group">
                <label for="fileInput">选择图片文件:</label>
                <input type="file" class="form-control" id="fileInput" name="file" required>
            </div>
            <button type="submit" class="btn btn-primary">上传并识别</button>
        </form>
        <div class="mt-3">
            <h2>识别结果:</h2>
            <pre id="result">上传图片以查看识别结果</pre>
        </div>
    </div>

    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="/js/app.js"></script>
</body>
</html>

src/main/resources/static/js/app.js

$(document).ready(function() {
    $('#uploadForm').on('submit', function(event) {
        event.preventDefault();

        // 获取文件输入
        var fileInput = $('#fileInput')[0].files[0];

        // 检查是否选择了文件
        if (!fileInput) {
            alert("请选择一个文件");
            return;
        }

        // 创建 FormData 对象
        var formData = new FormData();
        formData.append('file', fileInput);

        // 使用 jQuery 的 AJAX 发送 POST 请求
        $.ajax({
            url: '/api/ocr/extract',
            type: 'POST',
            data: formData,
            contentType: false, // 不设置内容类型,让浏览器自动处理
            processData: false, // 不处理数据,让它保持原样
            success: function(result) {
                // 在页面上显示识别结果
                $('#result').text(result);
            },
            error: function(xhr, status, error) {
                console.error('Error:', error);
                alert('识别失败,请稍后重试。');
            }
        });
    });
});

总结

在这篇文章中,我们展示了如何使用 EasyOCR 与 Spring Boot 集成实现图片文字识别。通过 Python 脚本处理 OCR 任务,并在 Spring Boot 应用中处理文件上传和调用 OCR 脚本,最终将识别结果返回给前端页面。这种方法结合了 EasyOCR 强大的文字识别能力与 Spring Boot 灵活的 Web 开发特性,为大家提供了一个完整的解决方案。


赞(3)
未经允许不得转载:工具盒子 » 基于 Spring Boot3.3 + OCR 实现图片转文字功能