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 {@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.mzph.cn/diannao/61762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cocos creator 3.8 一些事件的使用,加载预制体的两种方式 5

没搞懂rotation与angle&#xff0c;rotation既然是个四元素&#xff0c;可面板上的是什么Vec3的方式显示&#xff0c;而且发现旋转节点&#xff0c;哪怕单独的旋转y轴&#xff0c;有时候三个值也会发生变化&#xff0c;猜测可能引擎内部是按照一定的规则&#xff0c;来表示这个…

如何在react中使用 indexDb

下载依赖 npm install localforage 接下来像使用 localstore一样使用它 import React, { useEffect } from react; import localForage from localforage;const App () > {useEffect(() > {// 保存数据async function storeData() {try {await localForage.setItem(us…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

迁移学习理论与应用

迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习技术&#xff0c;旨在将一个任务&#xff08;源任务&#xff09;上学到的知识迁移到另一个相关但不完全相同的任务&#xff08;目标任务&#xff09;上&#xff0c;从而提高目标任务的学习效果。这种方法的核心…

近期两篇NeRF/3DGS-based SLAM方案赏析:TS-SLAM and MBA-SLAM

原文链接&#xff1a;近期两篇NeRF/3DGS-based SLAM方案赏析&#xff1a;TS-SLAM and MBA-SLAM paper1&#xff1a;TS-SLAM: 基于轨迹平滑约束优化的神经辐射场SLAM方法 导读 本文提出了TS-SLAM&#xff0c;一种改进的基于神经辐射场&#xff08;NeRF&#xff09;的SLAM方法…

游戏引擎学习第20天

视频参考:https://www.bilibili.com/video/BV1VkBCYmExt 解释 off-by-one 错误 从演讲者的视角&#xff1a;对代码问题的剖析与修复过程 问题的起因 演讲者提到&#xff0c;他可能无意中在代码中造成了一个错误&#xff0c;这与“调试时间标记索引”有关。他发现了一个逻辑问题…

《鸿蒙系统:开启智能新时代的璀璨之星》

一、鸿蒙系统&#xff1a;崛起之路 鸿蒙系统的发展历程堪称一部科技创新的传奇。2012 年&#xff0c;华为前瞻性地启动鸿蒙系统研发项目&#xff0c;彼时或许很少有人能预见到它未来的辉煌。2019 年&#xff0c;鸿蒙系统首个开发者预览版的发布&#xff0c;如同夜空中的一颗璀…

Vue Router 4 中的createWebHistory 显示不出重定向后的网页内容和 createWebHashHistory的区别

Vue Router 4 是 Vue.js 3 的官方路由库&#xff0c;它提供了多种方式来创建路由实例。createWebHistory 和 createWebHashHistory 都是 Vue Router 4 中用于创建历史记录管理器的方法。 1. createWebHistory 用途&#xff1a;使用浏览器的 HTML5 History API 来管理路由。UR…

SQL注入--DNSlog外带注入--理论

什么是DNSlog? DNS的作用是将域名解析为IP 而DNSlog就是存储在DNS服务器上的域名信息&#xff0c;它记录着用户对域名访问信息。可以理解为DNS服务器上的日志文件。 多级域名 比如blog.csdn.net&#xff0c;以点为分隔&#xff0c;从右向左依次是顶级域名、二级域名、三级域…

#Verilog HDL# Verilog中的ifdef/ifndef/else等用法

目录 示例1: 示例2: 示例3: 示例4: 通过示例讲解,`ifdef/`ifndef/`elsif/`else/`endif 的用法 示例1: // Style #1: Only single `ifdef `ifdef <FLAG>// Statements `endif// Style #2: `ifdef with `else part `ifdef <FLAG>// Statements `else// Sta…

Intelli下载Gradle返回Connect Time Out

文章目录 问题解决参考 问题 打开intelliJ项目后&#xff0c;下载Gradle时返回Connect Time Out, 需要对gradle wrapper进行配置。 解决 我的IntelliJthsg版本&#xff1a; IntelliJ IDEA 2023.2.4 (Community Edition) Build #IC-232.10203.10, built on October 25, 2023…

python: Serialize and Deserialize complex JSON using jsonpickle

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # Serialize and Deserialize complex JSON in Python # 描述&#xff1a;pip install jsonpickle https://github.com/jsonpi…

软件测试面试之重要的名词解释

1、测试(testing) 包括了所有生命周期活动的过程&#xff0c;包括静态的和动态的。涉及计划、准备和对软件产品及其相关工作产品的评估&#xff0c;用以确定它们是否满足了需求&#xff0c;证明它们是否符合了目标&#xff0c;以及是否发现了缺陷。 2.计算机软件的测试目的是 …

基于图的去中心化社会推荐过滤器

目录 原论文研究背景与研究意义概述论文所提出算法的主要贡献GDSRec算法原理与流程问题定义去中心化图&#xff08;decentralized graph&#xff09;所提出方法(三种并行建模)用户建模&#xff08;user modelling&#xff09; 模版代码讲解main.py顶层文件&#xff1a;用于集成…

计算机的错误计算(一百六十三)

摘要 四个算式“sin(0.00024/2)^2”、“(1-cos(0.00024))/2”、“(1-sqrt(1-sin(0.00024)^2))/2”以及“sin(0.00024)^2/(22*sqrt(1-sin(0.00024)^2))”是等价的。但是&#xff0c;在 MATLAB 中计算它们&#xff0c;输出不完全一致&#xff1a;中间两个算式的输出中含有错误数…

递归算法专题一>Pow(x, n)

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public double myPow(double x, int n) {return n < 0 ? 1.0 / pow(x,-n) : pow(x,n); }private double pow(double x, int n){if(n 0) return 1.0;double tmp pow(x,n / 2);return n % 2 0 ? tmp * tmp : tmp …

【系统架构设计师】真题论文: 论软件可靠性设计技术的应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2013年 试题3)解题思路论文素材参考软件可靠性设计技术概念主要的软件可靠性设计技术软件可靠性设计技术的应用流程真题题目(2013年 试题3) 随着软件的日益普及,系统中软件成分不断增加,使得系统对…

论文阅读 SimpleNet: A Simple Network for Image Anomaly Detection and Localization

SimpleNet: A Simple Network for Image Anomaly Detection and Localization 摘要&#xff1a; 该论文提出了一个简单且应用友好的网络&#xff08;称为 SimpleNet&#xff09;来检测和定位异常。SimpleNet 由四个组件组成&#xff1a;&#xff08;1&#xff09;一个预先训练的…

麦肯锡报告 | 未来的经济引擎:解读下一代竞争领域

随着科技和商业的快速发展&#xff0c;一些具有高增长性和高动态性的行业正在悄然崛起&#xff0c;成为推动全球经济发展的新引擎。这些行业被称为“竞争领域”&#xff08;Arenas&#xff09;。据麦肯锡全球研究院&#xff08;MGI&#xff09;的研究&#xff0c;这些领域有望在…

实战分享:如何在HP-UX上高效扩容Oracle 12c RAC ASM磁盘

文章目录 Oracle 12c RAC ASM磁盘扩容 for HP-UX一、扩容原因二、扩容前信息三、扩容详细步骤3.1 存储划分LUN&#xff0c;映射到Oracle 12c RAC相关主机组3.2 扫描查看磁盘3.3 检查两节点间的磁盘盘符是否一致3.4 以一个节点为准同步磁盘盘符3.5 更改磁盘属主、权限3.6 查看AS…