springBoot整合 Tess4J实现OCR识别文字(图片+PDF)

devtools/2024/11/24 2:12:30/

1. 环境准备

  • JDK 8 或更高版本
  • Maven 3.6 或更高版本
  • Spring Boot 2.4 或更高版本
  • Tesseract OCR 引擎
  • Tess4J 库

2. 安装 Tesseract OCR 引擎

            下载地址: Home · UB-Mannheim/tesseract Wiki · GitHub

             linux直接安装:sudo apt-get install tesseract-ocr

3. 引入pom文件


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

4. 实现 OcrService 类,目前支持png、jpeg、jpg、pdf

        注意:这里需要注意配置文件:设置Tesseract的数据路径,案例将tess安装到了D盘,如果是linux服务器,需求配置对应的地址,到tessdata路径;还需要设置识别语言,案例里为中文识别,如需对应的语言,需要下载对应的文件到安装目录下的tessdata文件夹中。识别语言包下载地址:GitHub - tesseract-ocr/tessdata: Trained models with fast variant of the "best" LSTM models + legacy models

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.stereotype.Service;
import java.awt.image.BufferedImage;
import java.io.File;
import org.apache.commons.io.FilenameUtils;
import javax.imageio.ImageIO;
import java.io.IOException;@Service
public class OcrService {public String recognizeText(File imageFile) {ITesseract instance = new Tesseract();instance.setDatapath("D:\\anzhuang\\ocr\\tessdata"); // 设置Tesseract的数据路径instance.setLanguage("chi_sim"); // 设置识别语言// 获取文件扩展名String extension = FilenameUtils.getExtension(imageFile.getName());// 根据文件扩展名设置Tesseract的图像类型if ("png".equalsIgnoreCase(extension)) {instance.setTessVariable("filename", "png");} else if ("jpg".equalsIgnoreCase(extension) || "jpeg".equalsIgnoreCase(extension)) {instance.setTessVariable("filename", "jpeg");} else if("pdf".equalsIgnoreCase(extension)){try {return processPDF(imageFile,instance);} catch (Exception e) {e.printStackTrace();return "Error: " + e.getMessage();}} else {return "Unsupported file format: " + extension;}try {return instance.doOCR(imageFile);} catch (TesseractException e) {e.printStackTrace();return "Error: " + e.getMessage();}}private String processPDF(File pdfFile, ITesseract instance) throws IOException, TesseractException {PDDocument document = PDDocument.load(pdfFile);PDFRenderer renderer = new PDFRenderer(document);StringBuilder result = new StringBuilder();for (int i = 0; i < document.getNumberOfPages(); i++) {BufferedImage image = renderer.renderImageWithDPI(i, 800); // 使用300 DPI渲染图像File tempImageFile = File.createTempFile("page" + i, ".png");ImageIO.write(image, "png", tempImageFile);result.append(instance.doOCR(tempImageFile));tempImageFile.delete(); // 删除临时文件}document.close();return result.toString();}
}

 5. OcrController实现案例:

package com.fan.ocr.controller;import com.fan.ocr.serivce.OcrService;
import net.sourceforge.tess4j.Tesseract;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;@RestController
@RequestMapping("/ocr")
public class OcrController {@Autowiredprivate OcrService ocrService;@PostMapping("/upload")public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return new ResponseEntity<>("File is empty", HttpStatus.BAD_REQUEST);}try {// 将文件保存到本地File convFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename());file.transferTo(convFile);// 调用OCR服务识别文字String result = ocrService.recognizeText(convFile);return new ResponseEntity<>(result, HttpStatus.OK);} catch (IOException e) {return new ResponseEntity<>("File upload error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}}
}

注意:初步观察,解析一页pdf耗时在30-40s之间,建议不要超过一页,可能会导致无响应或者等待时间太久。 


http://www.ppmy.cn/devtools/136432.html

相关文章

僵尸毁灭工程 服务搭建 联机教程 无需公网IP、服务器

主要内容 什么是僵尸毁灭工程 搭建该服务&#xff0c;需要准备什么 详细步骤 1.下载并运行 SteamCMD 2.下载僵尸毁灭服务端 3.运行 MoleSDN 进行异地联机 4.小伙伴皮蛋加入鼠鼠服务器 完成联机 什么是僵尸毁灭工程 一款由The Indie Stone开发的开放世界生存模拟游戏。游…

PHPstudy 全局安装composer +topthink5.1

1 安装php 2 安装composer 3 创建网站 4 一键启动 配置 方法一&#xff1a; 修改 composer 的全局配置文件&#xff08;推荐方式&#xff09; 打开命令行窗口&#xff08;windows用户&#xff09;或控制台&#xff08;Linux、Mac 用户&#xff09;并执行如下命令&#xf…

VB.Net笔记-更新ing

目录 1.1 设置默认VS的开发环境为VB.NET&#xff08;2024/11/18&#xff09; 1.2 新建一个“Hello&#xff0c;world”的窗体&#xff08;2024/11/18&#xff09; 1.3 计算圆面积的小程序&#xff08;2024/11/18&#xff09; 显示/隐式 声明 &#xff08;2024/11/18&…

设计模式:4、命令模式(双重委托)

目录 0、定义 1、命令模式包括四种角色 2、命令模式的UML类图 3、代码示例 0、定义 将一个请求封装为一个对象&#xff0c;从而使用户可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 1、命令模式包括四种角色 接…

Fastapi学习

安装fastapi 安装框架 pip install fastapi 安装uvicorn作为服务器启动项目 pip install "uvicorn[standard]" 用fastapi写一个简单的路由 fastapi定义路由有两种方式 a:在fastapi实例上定义路由 from fastapi import FastAPIapp FastAPI()app.get(/) def root…

数据结构--并查集

并查集 原理实现 原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。此后我们可能要反复用到查询某一个元素归属于那个集合的运算&#xff0c;适合于描述这类问题的抽象数据类型称为并查集。 并查集的本质就是一个森林&#xff0c;属于同一个集合…

flink学习(1)——standalone模式的安装

1、上传&#xff0c;解压&#xff0c;重命名&#xff0c;配置环境变量 将文件上传到/opt/modules下cd /opt/modules tar -zxf flink-1.13.6-bin-scala_2.11.tgz -C /opt/installs/mv flink-1.13.6/ flinkvi /etc/profile export FLINK_HOME/opt/installs/flink export PATH$PA…

Failed to start Docker Application Container Engine

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;读取不到数据&#xff0c;show databases;查看数据库报错 2&#xff09;重启docker服务&#xff0c;服务启动失败&#xff0c;查看日志报错如下图所示 3&#xff09;报错信息&#xff1a;chmod /data/docker: read-only…