Java识别图片或扫描PDF中的文字

article/2025/8/15 23:05:26

目录

使用工具

Java识别图片中的文字

Java识别扫描PDF中的文字

注意事项


图片和扫描文件通常以非文本格式存在,这使得其中的文字信息难以直接编辑、搜索或复制。为了解决这个问题,光学字符识别(OCR)技术应运而生。OCR通过分析图像中的文字区域并将其转换为可编辑的文本,从而使用户能够轻松提取信息。如今,OCR已被广泛应用于文档数字化、数据提取和文字搜索等多个领域,为各行各业带来了便利。这篇博客将探讨如何在Java中通过OCR技术识别图片和扫描PDF文件中的文字。

使用工具

首先,我们需要选择一个适当的OCR库。在Java中有许多OCR库,本文所使用的是Spire.OCR for Java。在使用该库前,我们需要完成以下两个步骤:

1. 在程序中引入该库的JAR

你可以通过官方地址下载该库的JAR包或通过Maven仓库拉取,依赖如下:

<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository>
</repositories>
<dependency><groupId>e-iceblue</groupId><artifactId>spire.ocr</artifactId><version>1.9.19</version>
</dependency>

2. 下载Spire.OCR for Java的模型

Spire.OCR for Java提供了支持Win 64位和Linux 64位操作系统的两种模型。我们需要根据自己的系统下载适合的模型:

  • Win-x64
  • Linux

下载完成后,将它解压并保存到特定的目录下。

完成以上两个步骤后,我们就可以使用该库实现识别图片和扫描PDF中的文字。

Java识别图片中的文字

以下是使用Spire.OCR for Java识别图片中的文字的主要步骤:

  • 创建OcrScanner类的实例。
  • 创建 ConfigureOptions 类的实例来设置扫描器配置。
  • 使用ConfigureOptions.setLanguage()方法指定文本识别的语言,默认设置为English(支持语言:English,Chinese,Chinesetraditional,French,German,Japanese和Korean)。
  • 使用ConfigureOptions.setModelPath()方法指定模型的路径。
  • 使用OcrScanner.ConfigureDependencies()方法将配置应用于扫描器。
  • 使用OcrScanner.scan()方法识别图片中的文本。
  • 使用OcrScanner.getText()方法从 OcrScanner 对象获取已识别的文本。
  • 将获取的文本写入文本文件。

以下代码示例展示了如何识别图片中的文本并将结果保存到文本文件中:

import com.spire.ocr.ConfigureOptions;
import com.spire.ocr.OcrException;
import com.spire.ocr.OcrScanner;import java.io.FileWriter;
import java.io.IOException;public class ExtractTextFromImage {public static void main(String[] args) {// 从图片中识别文字String scannedText = scanTextFromImage("测试.png", "Chinese", "E:\\win-x64");// 保存识别出的文字到文件saveTextToFile(scannedText, "图片文字.txt");}/*** 方法:从图片中识别文字* @param imagePath 图片路径* @param language OCR语言,支持语言包括 English, Chinese, Chinesetraditional, French, German, Japanese 和 Korean* @param modelPath OCR模型路径* @return 识别出的文字*/private static String scanTextFromImage(String imagePath, String language, String modelPath) {try {// 创建OcrScanner类的对象OcrScanner scanner = new OcrScanner();// 设置扫描器配置ConfigureOptions configureOptions = new ConfigureOptions();// 指定文本识别的语言configureOptions.setLanguage(language);// 指定模型的路径configureOptions.setModelPath(modelPath);// 将配置应用于扫描器scanner.ConfigureDependencies(configureOptions);// 识别图片中的文本scanner.scan(imagePath);// 获取识别出的文本return scanner.getText().toString();} catch (OcrException e) {System.out.println("OCR 文字识别时发生错误。");e.printStackTrace();return "";}}/*** 方法:将识别出的文字保存到文件* @param text 识别出的文字* @param filePath 保存文件路径*/private static void saveTextToFile(String text, String filePath) {// 将获取的文本写入文本文件try (FileWriter writer = new FileWriter(filePath)) {writer.write(text);System.out.println("文本已成功保存到 " + filePath);} catch (IOException e) {System.out.println("保存文本文件时发生错误。");e.printStackTrace();}}
}

原始图片和识别结果:

https://i-blog.csdnimg.cn/blog_migrate/fe6fb1564d36b343e1b5266985619ef6.png

Java识别扫描PDF中的文字

Spire.OCR for Java库并不支持直接处理PDF,因此要从扫描的 PDF 中提取文本,我们首先需要将 PDF 文档转换为图片。对于此任务,我们将使用Spire.PDF for Java库。转换完成后,再利用 Spire.OCR 从生成的图片中提取文本。

你可以通过该地址下载Spire.PDF for Java的JAR包或者通过Maven仓库拉取:

<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository>
</repositories>
<dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf</artifactId><version>10.10.0</version>
</dependency>

以下代码示例展示了如何识别扫描PDF中的文本并将结果保存到文本文件中:

import com.spire.ocr.ConfigureOptions;
import com.spire.ocr.OCRImageFormat;
import com.spire.ocr.OcrException;
import com.spire.ocr.OcrScanner;
import com.spire.pdf.PdfDocument;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;public class ExtractTextFromScannedPDF {public static void main(String[] args) throws OcrException, IOException {// 打开扫描PDF文档PdfDocument pdf = new PdfDocument();pdf.loadFromFile("扫描.pdf");// 从扫描PDF文档中识别文字并将结果保存到文本文件for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {BufferedImage image = convertPdfPageToImage(pdf, pageIndex);String scannedText = recognizeTextFromImage(image, "Chinese", "E:\\win-x64");// 将识别出的文本保存到文件saveTextToFile(scannedText, "扫描PDF文字.txt");}}/*** 方法:将PDF页面转换为图片* @param pdf PDF文档对象* @param pageIndex 页码索引,从0开始* @return 转换后的BufferedImage对象* @throws IOException 如果转换过程中发生I/O错误*/private static BufferedImage convertPdfPageToImage(PdfDocument pdf, int pageIndex) throws IOException {return pdf.saveAsImage(pageIndex);}/*** 方法:从图片中识别文字* @param image 要识别的BufferedImage对象* @param language OCR语言,支持语言包括 English, Chinese, Chinesetraditional, French, German, Japanese 和 Korean* @param modelPath OCR模型路径* @return 识别出的文字* @throws OcrException 如果OCR识别过程中发生错误* @throws IOException 如果转换BufferedImage为InputStream时发生I/O错误*/private static String recognizeTextFromImage(BufferedImage image, String language, String modelPath) throws OcrException, IOException {// 将BufferedImage转换为InputStreamByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "PNG", os);InputStream inputStream = new ByteArrayInputStream(os.toByteArray());// 配置并初始化OCR扫描器OcrScanner scanner = new OcrScanner();ConfigureOptions configureOptions = new ConfigureOptions();configureOptions.setLanguage(language); // 设置OCR识别语言configureOptions.setModelPath(modelPath); // 设置OCR模型路径scanner.ConfigureDependencies(configureOptions); // 应用配置// 识别文本scanner.Scan(inputStream, OCRImageFormat.Png);return scanner.getText().toString(); // 返回识别出的文本}/*** 方法:将识别出的文本保存到文件* @param text 识别出的文字* @param filePath 保存文件的路径*/private static void saveTextToFile(String text, String filePath) {try (FileWriter writer = new FileWriter(filePath)) {writer.write(text);System.out.println("文本已成功保存到 " + filePath);} catch (IOException e) {System.out.println("保存文本文件时发生错误。");e.printStackTrace();}}
}

注意事项

OCR的准确性很大程度上受到图片质量的影响。使用清晰、对比度良好,不模糊、倾斜的图片,可以提高识别结果的准确性。不同OCR库可能对不同语言和字体的支持程度不同,一些特定语言或字体可能识别效果较差。因此在识别完成后,最好再人工校正一遍。

本文完结。


http://www.hkcw.cn/article/iORShPydHI.shtml

相关文章

【C++】C++11新特性详解:可变参数模板与emplace系列的应用

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

使用宝塔面板快速部署SpringBoot+Vue项目(Java + Node)

使用宝塔面板快速部署SpringBootVue项目&#xff08;Java Node&#xff09; 项目主要技术栈准备工作1. 一台云服务器&#xff08;阿里云、腾讯云等&#xff09;&#xff0c;我这里使用的是阿里云的服务器&#xff08;2核2G&#xff09;2. 已安装宝塔面板3. 已开发完成的Spring…

一文弄懂 | YOLOv8网络结构解读 、yolov8.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

看这一篇就够了。本文内含YOLOv8网络结构图 yaml配置文件详细解读与说明 训练教程 训练参数设置参数解析说明等一些有关YOLOv8的内容&#xff01; YOLOv8v10专栏订阅链接&#xff1a;YOLOv10 创新改进高效涨点持续改进300多篇永久免费答疑 &#xff08;订阅的小伙伴&#xf…

[C++][第三方库][ODB]详细讲解

目录 1.介绍2.安装1.安装 build22.安装 odb-compiler3.安装 ODB 运行时库4.安装MySQL和客户端开发包5.安装 boost profile 库6.总体操作7.测试样例 3.ODB 常见操作1.ODB 类型映射2.ODB 编程1.指令2.示例 4.类与接口5.使用 1.介绍 ODB框架&#xff1a;数据库ORM框架 --> 对象…

【Python】解决Python报错:ERROR: Could not find a version that satisfies the requirement

成功解决Python报错&#xff1a;ERROR: Could not find a version that satisfies the requirement。ERROR: Could not find a version that satisfies the requirement 是 Python 的包管理工具 pip 在安装包时可能遇到的错误。这通常意味着 pip 没有找到与给定版本要求匹配的包…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)

目录 1. sizeof 和 strlen的区别 1.1 sizeof 1.2 strlen 2. 数组和指针习题解析 2.1 一维数组 2.2 字符数组 代码1&#xff1a; 代码2&#xff1a; 代码3: 代码4&#xff1a; 代码5&#xff1a; 代码6&#xff1a; 2.3 二维数组 3. 指针运算笔试题解析 3.1 3.…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

文章目录 PyQt5入门级超详细教程前言第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号与槽代码详解&#xff1a; 4.6 信号槽…

MathType的安装与word嵌入

博主近期在写论文&#xff0c;发现word编辑公式好像只能用MathType&#xff0c;于是就去下载安装&#xff0c;然后遇到了蛮多问题总结一下&#xff0c;希望能帮到有相同问题的大家~ 一.MathType的下载 博主是在官网直接下载的&#xff0c;个人觉得没啥问题&#xff0c;下的也…

matlab:二维绘图篇——plot绘图命令

目录 1.plot绘图命令 &#xff08;1)plot(x) 实例——实验数据曲线 实例——窗口分割 实例——随机矩阵 (2).plot(x,y) 实例——摩擦系数变化曲线 &#xff08;3&#xff09;plot(x1,y1,x2,y2,...) 实例——正弦图形 实例——正弦余弦图形 &#xff08;4&#xff09…

Python的包管理工具pip安装

Python的包管理工具pip安装 一、安装步骤1.检查 pip是否已安装2.安装 pip方法一&#xff1a;通过 ​ensurepip​ 模块安装(推荐)方法二&#xff1a;通过 ​get-pip.py​ 脚本安装&#xff08;经常应为网络域名问题连接不上&#xff09; 3.验证pip安装4.创建别名5.更新pip 二、常…

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件第1部分&#xff1a;初识 PyQt5 和安装1.1 什么是 PyQt5&#xff1f;1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…

C++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 包装器 1.1、function包装器 1.2、bind 1 包装器 1.1、function包装器 function包装器 也叫作适配器。C中的function本质是一个类模板&…

【Java 学习】详细讲解---包和导包、Scanner类、输入源

1. 包 1.1 什么是包&#xff1f; 举个例子&#xff0c;你和你的同学有不同的家庭&#xff0c;你们都有自己的爸爸妈妈&#xff0c;都有自己的家。在自己的家中你们可以按照自己爱好摆放东西&#xff0c;都互不干扰。但是&#xff0c;假如你们的家都在一起&#xff0c;你们就不…

LEfSe分析:R语言一句代码轻松实现

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 大家好&#xff0c;今天我将介绍如何使用R语言进行LEfSe&#xff08;Linear discriminant analysis Effect Size&#xff09;分析及可视化。LEfSe是一种基于线性判别分析的算法&#xff0c;…

马斯克遭白宫背刺 提名撤销引失望

刚走一天就遭白宫“背刺”,马斯克对此表示失望。2023年10月11日,美国国家航空航天局在休斯敦约翰逊航天中心首次向公众展示了从小行星贝努采集到的样本图片和视频。5月31日,美国白宫宣布撤销对富豪贾里德艾萨克曼出任下一任NASA局长的提名。据报道,艾萨克曼与企业家马斯克关…

双腿戴假肢男子4小时登顶泰山 毅力与自信的见证

5月31日上午,山东泰安泰山景区天气晴朗。一位双腿安装假肢的男士一手拄着拐杖一手抓住扶手向上攀登的场景被游客上传到社交媒体,引发网友热议。6月1日下午,当事人盛先生介绍,这是他第三次登泰山了,从中天门到南天门花费了约4个小时。盛先生说,今年端午假期前,他出差来到…

南京大学通报施工方偷窃学生物品 施工单位被罚违约金

5月29日,南京大学基本建设处发布了一份关于对南京诚善科技有限公司执行合同违约金的通报。通报指出,南京诚善科技有限公司员工于5月13日在学校宿舍楼内偷窃学生物品。根据施工合同相关规定并经处办公会研究确认,南京大学基本建设处决定对该公司执行2000元违约金,从工程款中…

为省30块钱 卡车司机在青海缺氧离世 爱心卡友千里送别

46岁的河南卡车司机常志荣在青藏线因高原缺氧离世。今天上午,多名爱心卡友跨越2400多公里,将他的骨灰及车辆从五道梁地区送回老家安阳林州。5月27日,常志荣在青藏线五道梁地区遭遇严重缺氧不幸去世。车友任先生透露,出发前同行曾建议他至少携带两罐氧气,但他为了节省30元费…

樊振东将改变德国联赛竞争格局 新援加盟引关注

北京时间6月1日,德甲萨尔布吕肯俱乐部宣布中国运动员樊振东加盟该俱乐部,将参与2025-2026赛季德国乒乓球甲级联赛和欧洲冠军联赛。这并不意味着国内赛场上看不到樊振东的身影。目前樊振东仍处在奥运后的调整期,计划通过全国比赛以及国内外俱乐部比赛逐步恢复运动状态。樊振东…

少写一点,发布快一点:2025年的前端极简主义

我们先直白点&#xff1a;你大概并不需要那些 Button.js、PrimaryButton.js、OutlinePrimaryButton.js 甚至 MaybeIfItsFridayButton.js。 在2025年&#xff0c;我们被过度抽象的组件库淹没了——原子设计、过度工程化的 UI 库。 现在&#xff0c;该是我们聊聊「反潮流」的前端…