java实现 PDF中的图片文字内容识别
通过Tesseract进行OCR识别
前提:安装好Tesseract并下载好简体中文语言包,本文在Windows上验证过,需要安装包可以关注 公号 easy4java获取
1.配置maven依赖
<!-- pdf 解析--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.1</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>jempbox</artifactId><version>1.8.11</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>xmpbox</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>preflight</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.0</version></dependency><!-- Tesseract OCR--><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version></dependency>
2.Java代码实现
/*** @Author:admin* @Date: 2025/4/21 15:53* @Description admin* @Version 1.0.0*/import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PDFTextRecognition {public static void main(String[] args) {try {long start = System.currentTimeMillis();// 1. 读取PDF文件PDDocument document = PDDocument.load(new File("C:\\Users\\admin\\Desktop\\test.pdf"));PDPage page = document.getPage(0);PDResources resource = page.getResources();Iterable<COSName> xobjects = resource.getXObjectNames();if (xobjects != null) {Iterator<COSName> imageItr = xobjects.iterator();while (imageItr.hasNext()) {COSName imageName = imageItr.next();boolean isImage = resource.isImageXObject(imageName);if (isImage) {PDImageXObject ixt = (PDImageXObject) resource.getXObject(imageName);// 3. 使用OCR识别图像中的文字Tesseract tesseract = new Tesseract();//从官网下载简体中文语言包tesseract.setLanguage("chi_sim");//要语言包放在安装目录下tessdata目录下tesseract.setDatapath("E:\\software\\tesseract\\tessdata"); // 设置Tesseract的语言数据文件路径//截取要识别的图片区域,减少无效区域的识别,如果有需要可以进行放大操作(提高识别的准确率)BufferedImage image = ixt.getImage();BufferedImage subImage = image.getSubimage(0, 0, 2000, 800);String text = tesseract.doOCR(subImage);extractContractNumber(text);System.out.println(text);}}}// 关闭PDF文档document.close();long end = System.currentTimeMillis();System.out.println("消费时长" + (end - start) / 1000 + "s");} catch (IOException | TesseractException e) {e.printStackTrace();}}/*** 通过正则解析识别出的内容** @param text*/public static void extractContractNumber(String text) {// 正则表达式模式Pattern supplierPattern = Pattern.compile("供\\s*方\\s*[::]\\s*(.*?)\\s*合\\s*同\\s*编\\s*号");Pattern contractNoPattern = Pattern.compile("合\\s*同\\s*编\\s*号\\s*[::]\\s*(\\w+)");Pattern buyerPattern = Pattern.compile("需\\s*方\\s*[,,]\\s*(.*?)\\s*签\\s*订\\s*日\\s*期");// 匹配供方Matcher supplierMatcher = supplierPattern.matcher(text);if (supplierMatcher.find()) {String supplier = supplierMatcher.group(1).replaceAll("\\s+", "");System.out.println("供方: " + supplier);}// 匹配合同编号Matcher contractNoMatcher = contractNoPattern.matcher(text);if (contractNoMatcher.find()) {String contractNo = contractNoMatcher.group(1);System.out.println("合同编号: " + contractNo);}// 匹配需方Matcher buyerMatcher = buyerPattern.matcher(text);if (buyerMatcher.find()) {String buyer = buyerMatcher.group(1).replaceAll("\\s+", "");System.out.println("需方: " + buyer);}}
}
相关文章:
java实现 PDF中的图片文字内容识别
通过Tesseract进行OCR识别 前提:安装好Tesseract并下载好简体中文语言包,本文在Windows上验证过,需要安装包可以关注 公号 easy4java获取 1.配置maven依赖 <!-- pdf 解析--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdf…...

GitLab_密钥生成(SSH-key)
目录 1.密钥命令 2.自定义路径 3.输2次密码 4.查看公钥:(打开文件) 5. 把公钥,放到GitLab上面 6.填写公钥标题 7.点击 Add key 按钮 8. 验证添加是否成功 9. 测试 SSH 连接 10.彩蛋(把ssh-key添加到python文…...

【视频时刻检索】Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读
Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读 ABSTRACT1 INTRODUCTION2 PRELIMINARIES3 OUR FRAMEWORK3.1 Multi-Modal Hypergraph Networks3.2 Variational Inference 4 EXPERIMENT6 CONCLUSION 文章信息: 发表于:WSDM 24 原文…...

BUUCTF-[GWCTF 2019]re3
[GWCTF 2019]re3 查壳,64位无壳 然后进去发现主函数也比较简单,主要是一个长度校验,然后有一个mprotect函数,说明应该又是Smc,然后我们用脚本还原sub_402219函数处的代码 import idc addr0x00402219 size224 for …...

C++入侵检测与网络攻防之暴力破解
目录 1.nessus扫描任务 2.漏洞信息共享平台 3.nessus扫描结果 4.漏扫报告的查看 5.暴力破解以及hydra的使用 6.crunch命令生成字典 7.其他方式获取字典 8.复习 9.关于暴力破解的防御的讨论 10.pam配置的讲解 11.pam弱密码保护 12.pam锁定账户 13.shadow文件的解析 …...

管理100个小程序-很难吗
20公里的徒步-真难 群里的伙伴发起了一场天目山20公里徒步的活动,想着14公里都轻松拿捏了,思考了30秒后,就借着春风带着老婆孩子就出发了。一开始溪流清澈见底,小桥流水没有人家;青山郁郁葱葱,枯藤老树没有…...

如何在Linux用libevent写一个聊天服务器
废话少说,先看看思路 因为libevent的回调机制,我们可以借助这个机制来创建bufferevent来实现用户和用户进行通信 如果成功连接后我们可以直接在listener回调函数里创建一个bufferevent缓冲区,并为每个缓冲区设置相应的读回调和事件回调&…...
系统设计(1)—前端—CDN—Nginx—服务集群
简介: 本指南旨涵盖前端、CDN、Nginx 负载均衡、服务集群、Redis 缓存、消息队列、数据库设计、熔断限流降级以及系统优化等模块的核心要点。我们将介绍各模块常见的设计方案与优化策略,并结合电商秒杀、SaaS CRM 系统、支付系统等高并发场景讨论实践技巧…...
算法设计与分析7(贪心算法)
Prim 算法(寻找最小生成树) 用途:Prim 算法是一种贪心算法,用于在加权无向图中寻找最小生成树(MST),即能够连接图中所有顶点且边的权重之和最小的子图。基本思路: 从图中任意一个顶…...

马浩棋:产通链CT-Chain 破局不动产 RWA,引领数智金融新变革
全球不动产 RWA 数智金融高峰论坛上马浩棋先生致辞 在全球不动产 RWA 数智金融高峰论坛暨产通链 CT-Chain 上链首发会的现场,犀牛世纪集团(香港)有限公司董事会主席马浩棋成为众人瞩目的焦点。此次盛会汇聚了全球金融、区块链及不动产领域的…...
神经符号混合与跨模态对齐:Manus AI如何重构多语言手写识别的技术边界
在全球化数字浪潮下,手写识别技术长期面临"巴别塔困境"——人类书写系统的多样性(从中文象形文字到阿拉伯语连写体)与个体书写风格的随机性,构成了人工智能难以逾越的双重壁垒。传统OCR技术在处理多语言手写场景时,准确率往往不足70%,特别是在医疗处方、古代文…...

学习整理在centos7上安装mysql8.0版本教程
学习整理在centos7上安装mysql8.0版本教程 查看linux系统版本下载mysql数据库安装环境检查解压mysql安装包创建MySQL需要的目录及授权新增用户组新增组用户配置mysql环境变量编写MySQL配置文件初始化数据库初始化msyql服务启动mysql修改初始化密码配置Linux 系统服务工具,使My…...
Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(下)
#作者:邓伟 文章目录 三、深度解析:源码逻辑与调优策略四、常见问题与排查五、最新动态与技术演进总结 三、深度解析:源码逻辑与调优策略 TaintManager 核心源码逻辑 (1)参数定义(kube-controller-manage…...

SIEMENS PLC程序解读 -BLKMOV (指定长度数据批量传输)
1、程序代码 2、程序解读 这段西门子 PLC 程序(程序段 10)实现了基于条件的数据块移动功能,具体解释如下: 条件触点: %M0.1 Always<>(TRUE)(注释为 AT<>1):当 M0.1 的值…...

初识HashMap
HashMap:无序,不重复,无索引 HashMap小练习: import java.text.ParseException; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer;import static java.lang.Math.abs;public cla…...

隧道高清晰广播如何提升行车安全体验?
在隧道中行驶时,驾驶员常面临回声干扰、语音模糊、信息过载等问题,传统广播系统可能不仅未能提供有效信息,反而因噪音增加驾驶压力。高清晰广播通过数字降噪、动态音效优化等技术,显著改善驾驶员的听觉体验,进而提升行…...

从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
文章目录 文章目标技术选型工程搭建1. 初始化项目2. 安装开发依赖3. 项目结构4. 配置文件tsconfig.json.eslintrc.jseslint.config.prettierrc.jsrollup.config.cjs创建 .gitignore文件 设置 Git 钩子创建示例工具函数8. 版本管理和发布9 工具函数测试方案1. 安装测试依赖2. 配…...
使用 Oracle 数据库进行基于 JSON 的应用程序开发
本文为“JSON-based Application Development with Oracle Database (and MongoDB compatibility)”翻译阅读笔记。 副标题为:版本 19c 和 21c,本地和云,自治JSON 数据库以及适用于 MongoDB 的 Oracle 数据库 API,版本为2022年2月…...
Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用
目录 一、背景与重要性二、CSS选择器基础与分类2.1 什么是选择器?2.2 选择器分类与语法 三、核心选择器详解与实战案例3.1 基础选择器:精准定位元素3.2 组合选择器:元素关系控制3.3 伪类与伪元素:动态与虚拟元素3…...

Cadence学习笔记之---原理图设计基本操作
目录 01 | 引 言 02 | 环境描述 03 | 原理图工具介绍 04 | 原理图设计基本操作 05 | 生成页间引用 06 | 元件自动编号 07 | 结 尾 01 | 引 言 书接上回,在前文中讲述了怎样制作常用的库元件,如电阻、二极管,IC器件,以及怎…...
从零开始学习人工智能Day5-Python3 模块
二、Python3基础语法学习 三、Python3 基本数据类型 四、Python3 数据类型转换 五、Python3 运算符 六、python基本数据类型(续) 七、Python3 控制语句 八、Python推导式 九、Python3 函数 十、Python3 数据结构 十一、Python3 模块 Python 中的模块(…...

进行性核上性麻痹饮食指南:科学膳食助力对抗疾病
进行性核上性麻痹是一种进展性神经退行性疾病,常导致患者出现吞咽困难、运动障碍等症状。科学合理的饮食不仅能为患者提供必要的营养支持,还能降低并发症风险,改善生活质量。 蛋白质是维持身体机能的关键,患者应注重优质蛋白的摄取…...
vue滑块组件设计与实现
vue滑块组件设计与实现 设计一个滑块组件的思想主要包括以下几个方面:用户交互、状态管理、样式设计和事件处理。以下是详细的设计思想: 1. 用户交互 滑块组件的核心是用户能够通过拖动滑块来选择一个值。因此,设计时需要考虑以下几点&…...

opencv函数展示4
一、形态学操作函数 1.基本形态学操作 (1)cv2.getStructuringElement() (2)cv2.erode() (3)cv2.dilate() 2.高级形态学操作 (1)cv2.morphologyEx() 二、直方图处理函数 1.直方图…...

附赠二张图,阐述我对大模型的生态发展、技术架构认识。
文章精炼,用两张图说明大模型发展业态方向,以及大模型主体技术架构。(目前还需要进一步验证我的Thought && ideas,等待机会吧.........) 图一:探究大模型三个层次应用方向,浅层次入门简…...

OpenCv高阶(九)——背景建模
目录 一、背景建模的核心目标与核心挑战 1. 核心目标 2. 核心挑战 二、背景建模模型 1、帧差法原理 2. 概率模型(Parametric Models) (1)高斯混合模型(Gaussian Mixture Model, GMM) (…...

leetcode - 字符串
字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如,str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1,则称字符串 s1( )可以从字符串 s2 获得。 例如…...

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理
1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解,键盘、显示器等都是文件,因为我们说过“Linux下,一切皆文件”,当然我们现在对于这句话的理解是片面的;狭义上理解,文件在磁盘上,磁盘是一…...

Freertos--统计所有任务栈信息以及CPU占比和钩子函数
一、概念 在 FreeRTOS 中统计任务栈信息和 CPU 占比是为了分析栈使用情况防止溢出、优化性能识别高负载任务、合理分配资源避免内存浪费、调试系统排查阻塞或优先级问题,有助于提升效率、确保稳定性、快速定位问题并防止崩溃,比如在你的蜂鸣器任务中可以…...

京东商品详情API接口调用技术指南
本文基于京东宙斯开放平台(JD Open API)的 jingdong.ware.product.detail.search.get 接口,提供商品详情数据获取的完整技术方案,包含参数说明、代码实现及实战避坑指南。 一、接口功能与权限 核心能力 获取商品SKU的完整信…...