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

目录

使用工具

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.mzph.cn/web/57277.shtml

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

相关文章

view design之table自定义单元格模版

View Design之table自定义单元格模版 在 columns 的某列声明 slot 后&#xff0c;就可以在 Table 的 slot 中使用参数。 slot 的参数有 3 个&#xff1a;当前行数据 row&#xff0c;当前列数据 column&#xff0c;当前行序号 index。 完整示例 <template><Table …

【Leecode】Leecode刷题之路第35天之搜索插入位置

题目出处 35-搜索插入位置-题目出处 题目描述 个人解法 思路&#xff1a; 1.依次遍历数组&#xff0c;看目标值是否在数组中 2.如果不在&#xff0c;将目标值插入数组&#xff08;涉及到数组移动、扩容&#xff09;&#xff0c;返回下标代码示例&#xff1a;&#xff08;Java…

深入解析JavaScript 中的 Object.defineProperty() 与 Object.defineProperties() 方法

目录 前言1. Object.defineProperty()2. Object.defineProperties() 前言 写在前面&#xff0c;基本的功能与差异如下&#xff1a; Object.defineProperty()&#xff1a; 定义单个属性&#xff0c;接受三个参数&#xff08;对象、属性名、描述符&#xff09; Object.definePr…

CAN物理层(ISO 11898-2 2024)

一、说明 CAN(Controller area network)中文名称是控制器局域网,是用于解决汽车众多控制部件之间的数据交换而开发的一种串行数据通信总线,可以使用双绞线来传输信号,由德国博世公司在20世纪80年代专门为汽车行业开发。 ISO 11898-2 2024版相对于2016版,主要由以下更新…

VQGAN(2021-06:Taming Transformers for High-Resolution Image Synthesis)

论文&#xff1a;Taming Transformers for High-Resolution Image Synthesis 1. 背景介绍 2022年中旬&#xff0c;以扩散模型为核心的图像生成模型将AI绘画带入了大众的视野。实际上&#xff0c;在更早的一年之前&#xff0c;就有了一个能根据文字生成高清图片的模型——VQGAN…

HBuilder X 中Vue.js基础使用4->表单输入绑定(三)

表单绑定是实现动态数据双向绑定的重要部分&#xff0c;它让开发者可以轻松地管理和响应用户输入。本文将详细介绍如何在Vue 3中利用v-model指令以及一些特定修饰符来处理不同类型的表单输入。 v-model双向数据绑定 Vue的 v-model 指令提供了双向绑定的功能&#xff0c;key在…

「虚拟现实中的心理咨询:探索心灵世界的新方法」

内容概要 当我们想到虚拟现实时&#xff0c;很多人会联想到游戏或娱乐&#xff0c;但如今其在心理咨询领域的应用正在逐渐崭露头角。传统的心理咨询方式常常局限在咨询室内&#xff0c;面临着空间和情感隔阂的问题。然而&#xff0c;沉浸式环境的出现&#xff0c;使得治疗者能…

2024最新的开源博客系统:vue3.x+SpringBoot 3.x 前后端分离

本文转载自&#xff1a;https://fangcaicoding.cn/article/54 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验&#xff0c;截止目前面试过近200位候选人&#xff0c;主导过单表上10亿、累计上100亿数据…

C++核心编程和桌面应用开发 第十七天(set和multiset容器 pair map和multimap容器)

目录 1.set和multiset容器 1.1构造和赋值 1.2交换和大小 1.3插入和删除 1.4统计和查找 1.5pair对组 1.6set和multiset的区别 1.7指定内置数据类型排序规则 1.8指定自定义数据类型排序规则 2.map和multimap容器 2.1构造和赋值 2.2交换和大小 2.3插入和删除 2.4统计…

01.如何用DDD重构老项目

学习资料来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

OSI公布OSAID 1.0版 “开源人工智能”首次被定义

在2024年ALL THINGS OPEN大会上&#xff0c;Open Source Initiative (OSI) 正式发布了开源人工智能定义&#xff08;OSAID&#xff09;1.0版本&#xff0c;标志着全球首个开源AI标准的诞生。OSAID将作为衡量人工智能系统是否符合“开源人工智能”标准的依据&#xff0c;为社区主…

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求&#xff1a;批量注册5个用户&#xff0c;从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果

【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影

文章目录 C 前缀和详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;前缀和基础应用1.1 一维前缀和模板题解法&#xff08;前缀和&#xff09;图解分析C代码实现易错点提示代码解读题目解析总结 1.2 二维前缀和模板题解法&#xff08;二维前缀和&#xff09;图解分析C…

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 发布日期&#xff1a;2024 年 10 月 28 日 Xcode 16.1 包含适用于 iOS 18.1、iPadOS 18.1、Apple tvOS 18.1、watchOS 11.1、macOS Sequoia 15.1 和 visionOS 2.1 的 SDK。Xco…

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; 三、提供 starter简化 Maven 配置 四、自动配置 Spring&#xff08;引导类&#xff09; 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; SpringBoot项目都会继…

业务流程顺畅度为何受制于数据失真

在当今数字化驱动的商业环境中&#xff0c;企业的业务流程高度依赖于数据的准确性和完整性。然而&#xff0c;数据失真问题却如同隐匿在流程中的“暗礁”&#xff0c;频繁地给企业的业务流程顺畅度带来严重挑战&#xff0c;进而影响企业的整体运营效率和竞争力。 数据失真的表…

vscode和pycharm在当前工作目录的不同|python获取当前文件目录和当前工作目录

问题背景 相信大家都遇到过一个问题&#xff1a;一个项目在vscode&#xff08;或pycharm&#xff09;明明可以正常运行&#xff0c;但当在pycharm&#xff08;或vscode&#xff09;中时&#xff0c;却经常会出现路径错误。起初&#xff0c;对于这个问题&#xff0c;我也是一知…

基于Java的电商书城系统源码带本地搭建教程

技术框架&#xff1a;jQuery MySQL5.7 mybatis jsp shiro 运行环境&#xff1a;jdk8 IntelliJ IDEA maven3 宝塔面板 系统功能介绍 该系统分为前台展示和后台管理两大模块&#xff0c;前台主要是为消费者服务。该子系统实现了注册&#xff0c;登录&#xff0c; 以及…

闯关leetcode——232. Implement Queue using Stacks

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/implement-queue-using-stacks/description/ 内容 Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal …

自动化测试覆盖率提升的关键步骤

自动化测试覆盖不足的问题可以通过增加测试用例的数量和质量、引入代码覆盖率分析工具、加强团队的测试意识和技能、优化测试框架和工具、自动化测试与手动测试相结合等方式来解决。其中&#xff0c;引入代码覆盖率分析工具是关键&#xff0c;它可以帮助我们精准地识别未被测试…