Python 识别图片和扫描PDF中的文字
目录
工具与设置
Python 识别图片中的文字
Python 识别图片中的文字及其坐标位置
Python 识别扫描PDF中的文字
注意事项
在处理扫描的PDF和图片时,文字信息往往无法直接编辑、搜索或复制,这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费力,还容易出错。光学字符识别(OCR)技术能够将图片中的文字转换为可编辑文本,使信息提取和处理更加高效。如今,OCR已广泛应用于扫描文件的转换、数字化文档的整理、以及自动化数据输入等领域。本文将介绍如何使用Python及相关OCR库,实现对图片和扫描PDF中文字的识别。
工具与设置
要在Python中实现从图片和扫描PDF中提取文本,我们需要选择一个适当的OCR库。本文所选择的库是Spire.OCR for Python。该库支持多种语言,包括英语、法语、德语、简体中文、繁体中文、日语、韩语等。在使用该库之前,我们需要完成以下两个步骤:
步骤1:安装Spire.OCR for Python
在终端中运行以下命令安装Spire.OCR for Python:
pip install Spire.OCR
步骤2:下载OCR模型
Spire.OCR for Python提供了支持Windows(64位)、Linux(64位)和MacOS(10.15及以上)操作系统的三种模型。我们需要根据自己的系统下载适合的模型:
- Win x64
- Linux x64
- Mac 10.15及以上
下载完成后,将它解压并保存到特定的目录下。
完成以上两个步骤后,我们就可以使用该库实现识别图片和扫描PDF中的文字。
Python 识别图片中的文字
从图片中提取文本的过程比较简单。首先,需要配置 OCR 扫描器的相关设置(例如:文本识别语言和OCR模型的路径);然后对图片进行扫描;最后将识别的文字保存为文本文件。
以下是从图片中提取文本的关键步骤:
- 初始化 OCR 扫描器:创建 OcrScanner 对象。
- 配置 OCR 设置:通过 OcrScanner 对象的 ConfigureDependencies 方法,设置 OCR 模型的路径和文本识别语言。
- 扫描图片:使用 OcrScanner 对象的 Scan() 方法,从图片中识别文本。
- 保存文本:获取识别出的文本并保存为文本文件。
实现代码:
from spire.ocr import *# 初始化OcrScanner对象
scanner = OcrScanner()# 配置OCR设置(文本识别语言和OCR模型路径)
# 支持的语言包括英语、法语、德语、日语、韩语、简体中文、繁体中文等
configureOptions = ConfigureOptions()
configureOptions.ModelPath = r'D:\OCR\win-x64'
configureOptions.Language = 'Chinese'
scanner.ConfigureDependencies(configureOptions)# 扫描图片
scanner.Scan(r'测试.png')# 获取识别的文本
text = scanner.Text.ToString() + '\n'# 将文本保存到文本文件
with open('输出.txt', 'a', encoding='utf-8') as file:
file.write(text + '\n')
原始图片和识别结果:

Python 识别图片中的文字及其坐标位置
有时除了识别文本外,还需要获取文本在图片中的坐标位置。Spire.OCR也支持提取这些信息。
以下是从图片中识别文本并获取其坐标位置的关键步骤:
- 初始化OCR扫描器:创建OcrScanner对象。
- 配置OCR设置:通过OcrScanner对象的ConfigureDependencies方法设置OCR模型的路径和文本识别语言。
- 扫描图片:使用OcrScanner 对象的Scan() 方法从图片中识别文本。
- 获取边框坐标:遍历识别的文本中的文本块,获取每个文本块的边框信息(x, y坐标及其宽度和高度)。
- 保存文本和坐标:将文本及其坐标保存到文本文件中。
实现代码:
from spire.ocr import *# 初始化OcrScanner对象
scanner = OcrScanner()# 配置OCR设置(文本识别语言和OCR模型路径)
# 支持的语言包括英语、法语、德语、日语、韩语、简体中文、繁体中文等
configureOptions = ConfigureOptions()
configureOptions.ModelPath = r'D:\OCR\win-x64'
configureOptions.Language = 'Chinese'
scanner.ConfigureDependencies(configureOptions)# 扫描图片
scanner.Scan(r'测试.png')# 遍历识别的文本中的文本块,提取每个文本块的文本和坐标位置等信息
text = ''
for block in scanner.Text.Blocks:rectangle = block.Boxpositions = f'{block.Text} -> x: {rectangle.X}, y: {rectangle.Y}, w: {rectangle.Width}, h: {rectangle.Height}'text += positions + '\n'# 将文本和坐标保存到文本文件
with open('图片文字及坐标.txt', 'a', encoding='utf-8') as file:file.write(text + '\n')
Python 识别扫描PDF中的文字
对于扫描的PDF文档,需先将每一页转换为图片格式。可以借助Spire.PDF for Python库来实现这一点。将PDF页面转换为图片后,即可对每张图片执行 OCR 处理。
在使用以下代码之前,请先通过以下命令安装Spire.PDF:
pip install Spire.PDF
以下是从扫描PDF中提取文本的关键步骤:
- 将PDF页面转换为图片:使用Spire.PDF加载扫描的PDF文档,然后使用PdfDocument.SaveAsImage()方法将文档的每一页保存为图片。
- 执行OCR:使用Spire.OCR识别每张图片中的文本。
- 保存识别的文本:将识别的文本保存到文本文件中。
实现代码:
from spire.pdf import *
from spire.ocr import *
import io# 将PDF页面转换为图片
def convert_pdf_page_to_image(pdf, page_index):return pdf.SaveAsImage(page_index)# 从图片中识别文本
def recognize_text_from_image(imgName, language, model_path):# 初始化OCR扫描器并配置OCR模型的路径和文本识别语言scanner = OcrScanner()configure_options = ConfigureOptions()configure_options.Language = languageconfigure_options.ModelPath = model_pathscanner.ConfigureDependencies(configure_options)# 执行OCR并返回识别的文本scanner.Scan(imgName)data = scanner.Text.ToString()return data# 加载扫描PDF文档
pdf = PdfDocument()
pdf.LoadFromFile('扫描.pdf')# 创建文本文件以保存提取的文本
with open('扫描PDF.txt', 'a', encoding='utf-8') as writer:for page_index in range(pdf.Pages.Count):# 将PDF页面转换为图片image = convert_pdf_page_to_image(pdf, page_index)imgName="toImage_"+str(page_index)+".png"image.Save(imgName)# 从图片中识别文本recognized_text = recognize_text_from_image(imgName, 'Chinese', r'D:\OCR\win-x64')# 将识别的文本写入文本文件writer.write(f'Page {page_index + 1}:\n')writer.write(recognized_text)writer.write('\n\n') # 在页面之间添加两个换行符print('文本已成功保存到"扫描PDF.txt"。')
注意事项
OCR的准确性很大程度上受到图片质量的影响。使用清晰、对比度良好,不模糊、倾斜的图片,可以提高识别结果的准确性。不同OCR库可能对不同语言和字体的支持程度不同,一些特定语言或字体可能识别效果较差。因此在识别完成后,最好再人工校对一遍。
以上就是使用Python识别图片和扫描PDF中的文字的全部内容。感谢阅读!
相关文章:
Python 识别图片和扫描PDF中的文字
目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时,文字信息往往无法直接编辑、搜索或复制,这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…...
C语言如何知道当前系统中的编译器数据类型的大小是多少?
在 C 语言中,你可以使用sizeof运算符来确定当前系统中编译器数据类型的大小,该运算符返回一个size_t类型的值,表示所操作对象或数据类型占用的字节数。下面为你详细介绍使用方法: 1. 基本数据类型大小的获取 基本数据类型如char…...
gitlab Webhook 配置jenkins时“触发远程构建 (例如,使用脚本)”报错
报错信息: <html> <head> <meta http-equiv"Content-Type" content"text/html;charsetISO-8859-1"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2…...
Mysql中使用sql语句生成雪花算法Id
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
/etc/profile vs ~/.bashrc:如何正确使用?
在 Linux 或 WSL 环境中,我们经常需要配置环境变量、命令别名、路径等信息。然而,许多人在配置时会纠结:到底应该放在 /etc/profile 还是 ~/.bashrc?本文将全面解析它们的区别,并帮助你做出正确的选择。 1. 什么是 /et…...
SpringBoot实战:高效获取视频资源
文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下,海量内容数据日益增长,每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据,已成为各大平…...
Flutter_学习记录_数据更新的学习
Flutter 如果界面上有数据更新时,目前学习到的有3种: 第一种: 直接用 StatefulWidget组件,然后当数据更新时,调用setState的方法更新数据,页面上的数据会直接更新;第二种: 用 State…...
c++ 多线程知识汇总
一、std::thread std::thread 是 C11 引入的标准库中的线程类,用于创建和管理线程 1. 带参数的构造函数 template <class F, class... Args> std::thread::thread(F&& f, Args&&... args);F&& f:线程要执行的函数&…...
day09_实时类标签/指标
文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…...
【前端开发学习笔记16】Vue_9
文章分类架子 多个页面复用,封装成组件: props 定制标题默认插槽 default 定制内容主体具名插槽 extra 定制按钮 <template><el-card class"page-container"><template #header><div class"header"><s…...
Bash 中的运算方式
目录 概述: 1. (()) 运算符 2. let 命令 3. expr 命令 4. $[] 直接运算 5. bc(计算器,支持浮点数) 6. awk(强大的文本处理工具,也可计算) 概述: Bash 本身只支持整数运算&am…...
2025年3月营销灵感日历
2025年的第一场营销大战已经拉开帷幕了! 三月可是全年最值钱的营销黄金月——妇女节、植树节、315消费者日三大爆点连击,还有春分、睡眠日、世界诗歌日等20隐藏流量密码。 道叔连夜扒了18个行业数据,整理了这份《2025年3月营销灵感日历》&a…...
MySQL的innoDB引擎
一、逻辑存储结构 表空间:ibd文件,一个MySQL实例可以对应多个表空间,用于存储记录,索引等数据; 段:分为数据段(leaf node segment)、索引段(non-leaf node segment)、回滚段(rollback segment),innodb是索引组织表,数据段就是B+树的非叶子节点。段用来管理多个e…...
HCIA项目实践---OSPF的知识和原理总结
9.5 OSPF 9.5.1 从哪些角度评判一个动态路由协议的好坏? (1)选路佳(是否会出环) OSPF 协议采用链路状态算法,通过收集网络拓扑信息来计算最短路径,从根本上避免了路由环路的产生。 (…...
hexo 魔改 | 修改卡片透明度
hexo 魔改 | 修改卡片透明度 ** 博客食物用更佳 博客地址 ** 这是笔者自己瞎倒腾的。作为前端菜鸡一枚,大佬们随便看看就好~ 我用的主题是 butterfly 4.12.0 分析 通过开发者工具可以看出来卡片的背景和 --card-bg 变量有关 再在 sources 下的 css 文件夹下的…...
今日AI和商界事件(2025-02-13)
今日AI领域的主要事件包括: 一、OpenAI相关动态 取消独立发布o3模型计划: OpenAI首席执行官奥尔特曼宣布,公司取消独立发布o3模型的计划。未来几个月内,OpenAI将推出GPT-5,该模型将整合多项技术,并应用于C…...
38.日常算法
1.最短无序连续子数组 题目来源 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。 示例 1: 输入…...
如何构建有效的人工智能代理
目录 什么是 AI 代理? 何时应使用 AI 代理? 人工智能代理的构建模块 构建 AI 代理的常用方法 1. 提示链接(分步说明) 2.路由(将任务发送到正确的地方) 3.并行处理(同时做多件事) 4. 协调者和工作者 AI(团队合作) 5. 评估器和优化器(修复错误) 如何让人工…...
qt 事件的传递顺序
在 Qt 中,事件的传递顺序遵循以下基本规则: 事件的产生:当用户与界面交互时,操作(如鼠标点击、键盘输入等)会生成相应的事件(如 QMouseEvent、QKeyEvent 等)。 事件的传递顺序&…...
全面掌握Flutter开发:从核心原理到跨平台实战,构建高效应用
文章目录 引言 一、Flutter框架概述二、Flutter开发环境搭建三、Flutter核心技术解析1. **Widget树与状态管理**2. **路由与导航**3. **网络请求与数据解析**4. **本地存储与数据库**5. **包管理与依赖** 四、实战案例:开发跨平台新闻客户端五、Flutter开发工具与调…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
