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引用深度详解 前言1. 引用的本质与核心特性1.1 引用概念1.2 核心特性 2. 常引用与权限控制2.1 权限传递规则2.2 常量引用2.3 临时变量保护1. 样例2. 样例3. 测试 三、引用使用场景分析3.1 函数参数传递输出型参数避免多级指针高效传参 3.2 做函数返回值正确使用危险案例 4. 性…...
SpringCloud - Gateway 网关
前言 该博客为Sentinel学习笔记,主要目的是为了帮助后期快速复习使用 学习视频:7小快速通关SpringCloud 辅助文档:SpringCloud快速通关 源码地址:cloud-demo 一、简介 官网:https://spring.io/projects/spring-clou…...
【JVM详解五】JVM性能调优
示例: 配置JVM参数运行 #前台运行 java -XX:MetaspaceSize-128m -XX:MaxMetaspaceSize-128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio8 - XX:UseConcMarkSweepGC -jar /jar包路径 #后台运行 nohup java -XX:MetaspaceSize-128m -XX:MaxMetaspaceS…...
基于 STM32 平台的音频特征提取与歌曲风格智能识别系统
标题:基于 STM32 平台的音频特征提取与歌曲风格智能识别系统 内容:1.摘要 摘要:本文介绍了一种基于 STM32 平台的音频特征提取与歌曲风格智能识别系统。该系统通过对音频信号进行特征提取和分析,实现了对歌曲风格的自动识别。在特征提取方面,…...
DeepSeek:搅动人工智能产业风云的鲶鱼效应深度解读
我的个人主页 我的专栏:人工智能领域,希望能帮助到大家!!!点赞❤ 收藏❤ 引言 在当今科技飞速发展的时代,人工智能(AI)无疑是最为耀眼的领域之一。众多技术与平台如繁星般涌现&a…...
一觉醒来全球编码能力下降100000倍,新手小白的我决定科普C语言——三子棋游戏实现
硬控我一上午,小编还是太菜了,大家可以自行升级电脑难度,也可以升级游戏到五子棋 1.game.h #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3//初始化棋盘 void InitBoa…...
学习 URL 传参中哪些字符是支持的,哪些是不支持的
URL 的结构 URL 由多个部分组成,包括协议、域名、路径、查询参数和片段标识符,其中,查询参数部分就是问号后面的内容,这部分使用键值对,中间用 & 分隔。比如,http://example.com/path?key1value1&…...
bingAI生成的易语言编程基础
易语言编程基础 易语言(EPL)是一种基于中文的编程语言,旨在简化编程学习过程,特别适合初学者和有一定编程基础的开发者。它通过中文关键词和语法,降低了编程的门槛,使得代码更加直观易懂。 示例ÿ…...
HTML应用指南:利用POST请求获取接入比亚迪业态的充电桩位置信息
在新能源汽车快速发展的今天,充电桩的分布和可用性成为了影响用户体验的关键因素之一。比亚迪作为全球领先的新能源汽车制造商,不仅在车辆制造方面取得了卓越成就,也在充电基础设施建设上投入了大量资源。为了帮助用户更方便地找到比亚迪充电桩的位置,本篇文章,我们将探究…...
高斯消元法及其C++实现
深入浅出高斯消元法及其C实现 本文章代码由博主编写但是文章由ChatGPT-o1-mini生成 博客食用更佳 在计算机算法竞赛中,线性方程组的求解是一个常见且基础的问题。高斯消元法作为一种经典的算法,因其高效和直观的特性,广泛应用于各种编程竞赛和…...
DeepSeek AI R1推理大模型API集成文档
DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展,大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型,凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计,吸引了大量开发…...
【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和
【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和 文章目录 一、dp1.1 题意理解1.2 整体思路1.3 具体思路1.4 代码 二、多语言解法 一、dp 1.1 题意理解 nums 数组, 有正负0, 使用最多两次魔法卷轴, 希望使数组整体的累加和尽可能大. 求尽可能大的累加和 其实就…...
【R】Dijkstra算法求最短路径
使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data,存放有向图信息 data中每个点所在的行序号为起始点序号,列为终点序号。 比如:值4的坐标为(1,2)即点1到点2距离为4;值8的坐标为(6,7)…...
深入浅出:探索 DeepSeek 的强大功能与应用
深入浅出:探索 DeepSeek 的强大功能与应用 在人工智能技术飞速发展的今天,自然语言处理(NLP)作为其重要分支,正逐渐渗透到我们生活的方方面面。DeepSeek 作为一款功能强大的 NLP 工具,凭借其易用性和高效性…...
西门子S7-200 PLC串口PPI转以太网通讯的模块链接方式
项目背景 某汽车零部件生产车间有30台自动化生产设备,控制系统采用西门子S7-200系列的CPU226。此前,设备的一个通讯端口用于和变频器进行自由口通讯,另一个通讯端口连接着一台昆仑通态触摸屏作为人机界面。车间计划进行智能化升级ÿ…...
win10向windows server服务器传输文件
win10向windows server服务器传输文件 遇到无法直接拖动文件进行传输时 解决方案: 1.点击显示选项 2.点击本地资源-详细信息 3.在窗口中选择你需要共享的磁盘 4.然后远程连接到Windows server服务器 5.登录Windows server服务器后,在此电脑下就能看…...
git服务器搭建,gitea服务搭建,使用systemclt管理服务
文章目录 页面展示使用二进制文件安装git服务下载选择架构使用wget下载安装 验证 GPG 签名服务器设置准备环境创建systemctl文件 备份与恢复备份命令 (dump)恢复命令 (restore) 页面展示 使用二进制文件安装git服务 所有打包的二进制程序均包含 SQLite,MySQL 和 Po…...
Mybatis快速入门与核心知识总结
Mybatis 1. 实体类(Entity Class)1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件(可选)3.1 …...
用docker在本地用open-webui部署网页版deepseek
前置条件 用Ollama在本地CMD窗口运行deepseek大模型-CSDN博客文章浏览阅读109次,点赞5次,收藏2次。首次运行需要下载deepseek的大模型包(大约5GB,根据本地网速的不同在半个小时到几个小时之间下载完成) ,并…...
2025.2.8——一、[护网杯 2018]easy_tornado tornado模板注入
题目来源:BUUCTF [护网杯 2018]easy_tornado 目录 一、打开靶机,整理信息 二、解题思路 step 1:分析已知信息 step 2:目标——找到cookie_secret step 3:构造payload 三、小结 一、打开靶机,整理信…...
前端实现在PDF上添加标注(1)
前段时间接到一个需求,用户希望网页上预览PDF,同时能在PDF上添加文字,划线,箭头和用矩形框选的标注,另外还需要对已有的标注进行修改,删除。 期初在互联网上一通搜索,对这个需求来讲发现了两个问…...
【CXX-Qt】1.1 Rust中的QObjects
本文涉及到了使用CXX-Qt将Rust、C和QML集成到Qt应用程序中的各个方面。下面,我将提供一个简单的示例,演示如何使用CXX-Qt来创建一个Rust结构体并将其作为QObject子类暴露给C和QML。 一、设置CXX-Qt环境 首先,确保您已经安装了Rust、CXX和CX…...
操作系统中的任务调度算法
一、引言 在操作系统中,任务调度算法是核心组件之一,它负责合理分配有限的 CPU 资源,以确保系统的高效运行和良好的用户体验。任务调度的目标是实现公平性、最小化等待时间、提高系统吞吐量,并最大化 CPU 的利用率。不同的任务调…...
GitCode 助力 Easy-Es,革新 Elasticsearch 开发体验
项目仓库(点击阅读原文链接可直达) https://gitcode.com/dromara/easy-es 项目背景:填补 Elasticsearch ORM 框架空白 在 Java 开发领域,Excel 和 Elasticsearch 的代码编写难度一直名列前茅,尤其是 Elasticsearch&a…...
线程同步(互斥锁与条件变量)
文章目录 1、为什么要用互斥锁2、互斥锁怎么用3、为什么要用条件变量4、互斥锁和条件变量如何配合使用5、互斥锁和条件变量的常见用法 参考资料:https://blog.csdn.net/m0_53539646/article/details/115509348 1、为什么要用互斥锁 为了使各线程能够有序地访问公共…...
EF Core中实现值对象
目录 值对象优点 值对象的需求 值类型的实现 值类型GEO的实现 值类型MultilingualString的实现 案例:构建表达式树,简化值对象的比较 值对象优点 把有紧密关系的属性打包为一个类型把领域知识放到类的定义中 class shangjia {long id;string nam…...
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题
前言 在这篇博客中,我们将通过模拟的方法来解决三道经典的算法题:回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力,还挑战了我们对日期处理和数学推理的理解。通过模拟算法,我们能够深入探索每个问题的核心…...
Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
1. 如何在 Kubernetes 中设置资源请求和限制? 资源请求确保容器有最小资源量(CPU/内存),而限制则强制容器消耗的最大资源量。这有助于高效资源分配并防止资源争用。 示例: resources:requests:memory: "256Mi&…...
Docker Compose介绍及安装使用MongoDB数据库详解
在现代容器化应用部署中,Docker Compose是一种非常实用的工具,它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而,除了Docker之外,Podman也提供了类似的工具——Podman Compose,它允许我们在…...
