SpringBoot + Tess4J 实现本地与远程图片的文字识别

1 前言

1.1 概要

在本文中,我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR(光学字符识别),以识别出本地和远程图片中的文字。

我们将从添加依赖说起,然后创建服务类以实现OCR,最后展示如何处理用户上传的本地图片和远程图片URL进行文字识别。

1.2 背景

随着信息技术的不断进步,图片中的文字提取已经越来越多地应用于数据输入和自动化处理过程。Tess4J,作为Tesseract OCR引擎的Java JNA封装,提供了一个能力强大的接口来实现这一功能。

在Spring Boot中整合Tess4J,我们可以快速地在Java应用中优雅地实现文字识别。本文将在Spring Boot项目中实现这一功能。

2 代码实战

2.1 第1部分:环境搭建

在开始之前,请确保有以下环境配置:

  • JDK 1.8或更高版本
  • Maven
  • 最新版的Spring Boot
  • Tess4J版本4.x或更高

2.2 第2部分:添加依赖

在pom.xml中加入以下依赖,以便于使用Tess4J:

<dependencies><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version></dependency><!-- 其他依赖 -->
</dependencies>

确保以上版本是最新的,或者是适配当前开发环境的版本。

2.3 第3部分:添加Tessdata语言库

百度网盘下载:

链接:https://pan.baidu.com/s/1rzOYZz3gfrbWmGRUolflqQ
提取码:em4z

在这里插入图片描述

2.4 第4部分:创建OCR服务类

@Service
public class OcrService {public String recognizeText(File imageFile) throws TesseractException {Tesseract tesseract = new Tesseract();// 设定训练文件的位置(如果是标准英文识别,此步可省略)tesseract.setDatapath("tessdata各语言集合包地址");tesseract.setLanguage("chi_sim");return tesseract.doOCR(imageFile);}public String recognizeTextFromUrl(String imageUrl) throws Exception {URL url = new URL(imageUrl);InputStream in = url.openStream();Files.copy(in, Paths.get("downloaded.jpg"), StandardCopyOption.REPLACE_EXISTING);File imageFile = new File("downloaded.jpg");return recognizeText(imageFile);}
}

在这段代码中,recognizeText(File imageFile)方法负责执行对本地文件的OCR任务,而recognizeTextFromUrl(String imageUrl)方法则先将远程图片下载到本地,然后再执行OCR。

2.5 第5部分:建立REST控制器

@RestController
@RequestMapping("/api/ocr")
public class OcrController {private final OcrService ocrService;// 使用构造器注入OcrServicepublic OcrController(OcrService ocrService) {this.ocrService = ocrService;}@PostMapping("/upload")public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file) {try {File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+file.getOriginalFilename());file.transferTo(convFile);String result = ocrService.recognizeText(convFile);return ResponseEntity.ok(result);} catch (Exception e) {e.printStackTrace();return ResponseEntity.badRequest().body("识别发生错误:" + e.getMessage());}}@GetMapping("/recognize-url")public ResponseEntity<String> recognizeFromUrl(@RequestParam("imageUrl") String imageUrl) {try {String result = ocrService.recognizeTextFromUrl(imageUrl);return ResponseEntity.ok(result);} catch (Exception e) {e.printStackTrace();return ResponseEntity.badRequest().body("从URL识别发生错误:" + e.getMessage());}}
}

在这个控制器中,我们创建了两个端点:/api/ocr/upload用于处理用户上传的本地图片,而/api/ocr/recognize-url则处理给定URL的远程图片。

3 测试

使用Postman直接请求:

在这里插入图片描述

4 小结

通过以上步骤,现在拥有了一个能够处理本地和远程图片文字识别的Spring Boot服务。在实践中,可能需要根据实际情况调整配置,例如在多语言环境中设置正确的语言包等。

尽管OCR技术仍然有提升空间,但通过Tess4J,可以取得非常不错的起点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/459681.html

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

相关文章

jxls 2.4.5 —— 动态导出excel 表头与数据

文章目录 前言依赖引入制作导出模板测试类导出效果注意事项 前言 再之前的博客中&#xff0c;介绍了jxls的基础使用。但导出表头属于写死的&#xff0c;并未采取动态渲染。 本次进行动态渲染操作&#xff0c;动态渲染表头和填充数据。 依赖引入 springboot测试项目中&#…

canvas实现涂鸦画板功能

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

【每日一题】LeetCode——链表的中间结点

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码

一、莱文斯坦&#xff08;Levenshtein&#xff09; Vladimir I. Levenshtein 弗拉基米尔I列文施坦博士是纠错码理论的先驱&#xff0c;被称为俄罗斯编码理论之父。Levenshtein是莫斯科俄罗斯科学院Keldysh应用数学研究所的研究教授&#xff0c;他的贡献体现在消费者的日常生活中…

【网络技术】【Kali Linux】Nmap 嗅探(一)简单扫描

一、实验环境 本次实验进行简单的Nmap扫描&#xff0c;实验使用 Kali Linux 虚拟机和 Ubuntu Linux 虚拟机完成&#xff0c;主机操作系统为 Windows 11&#xff0c;虚拟化平台选择 Oracle VM VirtualBox&#xff0c;如下图所示。 二、实验步骤 1、相关配置 Kali Linux 虚拟机…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士&#xff0c;您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作&#xff0c;拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中&#xff0c;我们将介绍当今…

Verilog刷题笔记23

题目: Suppose you’re building a circuit to process scancodes from a PS/2 keyboard for a game. Given the last two bytes of scancodes received, you need to indicate whether one of the arrow keys on the keyboard have been pressed. This involves a fairly simp…

2/7 算法每日N题(二分+双指针)

第一题&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;int num nums[mid];if (num target) {return mid;} else if (num >…

React | Center 组件

在 Flutter 中有 Center 组件&#xff0c;效果就是让子组件整体居中&#xff0c;挺好用。 React 中虽然没有对应的组件&#xff0c;但是可以简单封装一个&#xff1a; index.less .container {display: flex;justify-content: center;align-items: center;align-content: ce…

Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中

Pandas 从Excel 中读取带有 Multi-column的数据 正文 正文 我们使用如下方式写入数据&#xff1a; import pandas as pd import numpy as npdf pd.DataFrame(np.array([[10, 2, 0], [6, 1, 3], [8, 10, 7], [1, 3, 7]]), columns[[Number, Name, Name, ], [col 1, col 2, co…

DIFFER,一种用于测试和验证转换程序的新工具

我们最近发布了一个新的差异测试工具&#xff0c;称为 DIFFER&#xff0c;用于查找转换后的程序中的错误和健全性违规。 DIFFER 结合了差分、回归和模糊测试的元素&#xff0c;帮助用户发现被软件重写、反膨胀和强化工具更改的程序中的错误。我们使用 DIFFER 评估了 10 个软件反…

数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)

数据库管理147期 2024-02-07 数据库管理-第147期 最强Oracle监控EMCC深入使用-04&#xff08;20240207&#xff09;1 发现Exadata2 Exadata监控计算节点&#xff1a;存储节点RoCE交换机管理交换机PDU 总结 数据库管理-第147期 最强Oracle监控EMCC深入使用-04&#xff08;202402…