当前位置: 首页 > article >正文

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

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 {
 
    @Autowired
    private 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.kler.cn/a/401512.html

相关文章:

  • CSS3_动画(九)
  • IO流(九):打印流-字节打印流PrintStream、字符打印流PrintWriter
  • web——upload-labs——第十关——.空格.绕过
  • 智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁
  • 物联网——UNIX时间戳、BKP备份寄存器、RTC时钟
  • 河道无人机雷达测流监测系统由哪几部分组成?
  • LeetCode 单调栈 下一个更大元素 I
  • gitlab cicd搭建及使用笔记(二)
  • SpringBoot整合Ip2region获取IP地址和定位
  • 蓝桥杯每日真题 - 第16天
  • 普通单片机为什么无法直接驱动dcmi接口相机
  • 【智能优化】自动分包策略,Webpack性能提升新维度(6)
  • docker minio修改时区问题记录
  • 109页PPT丨全面优化:制造企业运营生产成本削减战略与实践指南
  • 音视频开发库ffmpeg应用
  • 一文详细深入总结服务器选型
  • Elasticsearch开启认证及kibana密码登陆
  • 抓包工具Fiddler安装及汉化
  • 网络基础(3)https和加密
  • 网络安全 与 加密算法
  • 基于YOLOv8深度学习的智慧农业山羊行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
  • android studio -gradle Caused by: java.lang.NoClassDefFoundError -换版本方案
  • 竞赛笔记:Hybrid Search (Ensemble Encoder + BM25)
  • Java策略模式应用实战
  • 优化 MFC CGridCtrl 的表格布局与功能
  • C语言练习.switch