深入探索pdfplumber:从PDF中提取信息到实际项目应用【第94篇—pdfplumbe】

news/发布时间2024/5/18 15:13:05

深入探索pdfplumber:从PDF中提取信息到实际项目应用

在数据处理和信息提取的过程中,PDF文档是一种常见的格式。然而,要从PDF中提取信息并进行进一步的分析,我们需要使用适当的工具。本文将介绍如何使用Python库中的pdfplumber库来读取PDF文档,并通过实际代码示例演示如何将提取的信息写入Excel文件。

image-20240223150450981

1. pdfplumber简介

pdfplumber是一个用于处理PDF文件的Python库,它基于PDFMiner、pyPDF2和其他库构建而成。它提供了简单而强大的接口,使得从PDF文档中提取文本、表格和其他元素变得更加容易。

2. 安装pdfplumber

首先,确保你已经安装了Python。然后使用以下命令安装pdfplumber:

pip install pdfplumber

3. 使用pdfplumber读取PDF文档

让我们通过以下步骤演示如何使用pdfplumber读取PDF文档。

import pdfplumber# 读取PDF文档
with pdfplumber.open('example.pdf') as pdf:# 获取文档的总页数total_pages = len(pdf.pages)# 遍历每一页for page_number in range(total_pages):# 获取当前页page = pdf.pages[page_number]# 提取文本内容text = page.extract_text()# 打印文本内容print(f"Page {page_number + 1}:\n{text}")

以上代码演示了如何打开PDF文档,获取总页数,并遍历每一页提取文本内容。接下来,我们将演示如何提取表格数据,并将其写入Excel文件。

4. 将提取的表格数据写入Excel

import pdfplumber
import pandas as pd# 读取PDF文档
with pdfplumber.open('example.pdf') as pdf:# 获取文档的总页数total_pages = len(pdf.pages)# 创建一个空的DataFrame来存储表格数据df = pd.DataFrame()# 遍历每一页for page_number in range(total_pages):# 获取当前页page = pdf.pages[page_number]# 提取表格数据table = page.extract_table()# 将表格数据转换为DataFramedf_page = pd.DataFrame(table)# 将当前页的数据添加到整体DataFrame中df = df.append(df_page, ignore_index=True)# 将DataFrame写入Excel文件df.to_excel('output.xlsx', index=False)

以上代码演示了如何使用pdfplumber提取PDF文档中的表格数据,并将其存储到一个Pandas DataFrame中。最后,将DataFrame写入Excel文件。这样,你就可以轻松地将PDF中的表格数据转移到Excel进行进一步分析。

6. 代码解析

让我们深入了解上述代码的关键部分:

  • 导入pdfplumber和pandas库:

    import pdfplumber
    import pandas as pd
    

    在代码的开头,我们导入了pdfplumber和pandas库。pdfplumber用于处理PDF文件,而pandas用于处理表格数据。

  • 打开PDF文档并遍历每一页:

    with pdfplumber.open('example.pdf') as pdf:total_pages = len(pdf.pages)df = pd.DataFrame()for page_number in range(total_pages):page = pdf.pages[page_number]# ...
    

    使用pdfplumber.open打开PDF文档,并通过pdf.pages获取文档中的所有页。然后,我们创建一个空的DataFrame df 用于存储表格数据,并使用for循环遍历每一页。

  • 提取表格数据和将其转换为DataFrame:

    table = page.extract_table()
    df_page = pd.DataFrame(table)
    

    使用page.extract_table()方法从当前页提取表格数据,并将其转换为Pandas DataFrame。

  • 将当前页的数据添加到整体DataFrame中:

    df = df.append(df_page, ignore_index=True)
    

    使用df.append方法将当前页的数据添加到整体DataFrame中。ignore_index=True确保每页的数据都具有唯一的索引。

  • 将DataFrame写入Excel文件:

    df.to_excel('output.xlsx', index=False)
    

    使用df.to_excel方法将整体DataFrame写入Excel文件,index=False表示不将DataFrame的索引写入Excel文件中。

8. 进阶应用与注意事项

8.1 进阶应用
  • 处理复杂表格结构: 对于包含合并单元格、嵌套表格等复杂结构的PDF表格,pdfplumber提供了一些高级的方法和属性,如cellsmerge_strategy等,使我们能够更灵活地处理这些情况。

  • 提取非文本元素: pdfplumber不仅可以提取文本数据,还可以获取图片、矩形、线条等元素。这为处理包含图像或其他非文本内容的PDF提供了可能性。

8.2 注意事项
  • PDF文档质量: pdfplumber的性能受到PDF文档质量的影响。在处理低质量或扫描的文档时,提取数据可能会变得更加复杂,需要更多的处理和清理。

  • 编码和字体: 在处理PDF文档时,特别是处理非英语文本时,可能会遇到编码和字体的问题。确保系统中安装了适当的字体,并根据需要设置文本编码。

  • 文档结构变化: pdfplumber依赖于PDF的结构,如果文档的结构发生变化,可能需要调整代码以适应新的结构。

10. 拓展阅读与学习资源

为了帮助读者更深入地学习和应用pdfplumber以及相关技术,以下是一些拓展阅读和学习资源:

  • PDFMiner官方文档: pdfplumber基于PDFMiner,因此熟悉PDFMiner库的使用也是有益的。PDFMiner的官方文档提供了对PDF文档的更底层访问,适合需要更高度自定义的场景。
  • Python编程学习: 如果你是Python新手,建议深入学习Python编程语言的基础知识。你可以通过在线教程、课程或经典教材来提高你的Python编程技能。

11. 探索其他PDF处理工具

pdfplumber是众多用于处理PDF的Python库之一。根据不同需求,你可能还会对其他库感兴趣,如PyMuPDF、PyPDF2等。了解多个库的优缺点,选择适合你项目需求的工具。

12. 参与社区与反馈

如果在使用pdfplumber的过程中遇到问题或有建议,可以通过GitHub等社区渠道提出。积极参与社区讨论,与其他开发者分享经验,共同促进工具的不断改进。

希望通过这些建议和资源,你能够更加深入地学习和应用PDF文档处理技术,提升你的数据分析和信息提取能力。祝你在技术学习的道路上取得更多成就!

13. 实践项目:从PDF中提取特定信息

为了更好地巩固对pdfplumber的理解,让我们尝试一个实践项目:从一份包含多个人员信息的PDF文件中提取姓名、邮箱地址和电话号码,并将其存储到一个结构化的数据格式中。

import pdfplumber
import redef extract_information_from_pdf(pdf_path):with pdfplumber.open(pdf_path) as pdf:total_pages = len(pdf.pages)# 创建一个空的列表用于存储信息extracted_data = []for page_number in range(total_pages):page = pdf.pages[page_number]# 提取文本内容text = page.extract_text()# 使用正则表达式提取姓名、邮箱地址和电话号码name_match = re.search(r'姓名: (.+)', text)email_match = re.search(r'邮箱: (.+)', text)phone_match = re.search(r'电话: (.+)', text)if name_match and email_match and phone_match:name = name_match.group(1)email = email_match.group(1)phone = phone_match.group(1)# 将提取的信息添加到列表中extracted_data.append({'姓名': name, '邮箱': email, '电话': phone})return extracted_data# 指定PDF文件路径
pdf_file_path = 'person_info.pdf'# 提取信息并打印
result = extract_information_from_pdf(pdf_file_path)
for entry in result:print(entry)

在这个示例中,我们使用正则表达式从每一页的文本中提取姓名、邮箱地址和电话号码。请注意,实际的PDF文档结构可能因具体情况而异,你可能需要根据文档的实际结构进行适当的调整。

14. 进一步学习

  • 深入学习正则表达式: 正则表达式在文本提取中非常有用。深入学习正则表达式的语法和应用可以帮助你更高效地处理各种文本模式。

  • 数据清洗与预处理: 在实际项目中,你可能需要进行更复杂的数据清洗和预处理。学习Pandas和其他数据处理工具,掌握数据清洗技巧将对你的工作大有裨益。

  • Web Scraping: 如果你的信息源不仅限于PDF文档,还包括Web页面,学习Web Scraping技术将进一步拓展你的信息获取能力。

15. 反馈与交流

如果在实践项目中遇到了问题或有任何疑问,欢迎在相关社区、论坛或平台上提出。与其他开发者分享你的经验,获取反馈,这对于你的学习和成长都是非常有益的。祝你在实际项目中取得成功!

16. 最佳实践:代码优化和异常处理

在实际项目中,为了保证代码的可维护性和稳定性,我们通常需要考虑一些最佳实践,包括代码优化和异常处理。

16.1 代码优化
  • 使用函数和模块: 将代码组织为函数和模块,以提高可读性和可维护性。将上述提取信息的代码封装成一个函数,便于复用和管理。
import pdfplumber
import redef extract_information_from_text(text):name_match = re.search(r'姓名: (.+)', text)email_match = re.search(r'邮箱: (.+)', text)phone_match = re.search(r'电话: (.+)', text)if name_match and email_match and phone_match:name = name_match.group(1)email = email_match.group(1)phone = phone_match.group(1)return {'姓名': name, '邮箱': email, '电话': phone}else:return Nonedef extract_information_from_pdf(pdf_path):with pdfplumber.open(pdf_path) as pdf:total_pages = len(pdf.pages)extracted_data = []for page_number in range(total_pages):page = pdf.pages[page_number]text = page.extract_text()result = extract_information_from_text(text)if result:extracted_data.append(result)return extracted_data
16.2 异常处理
  • 处理异常情况: 在现实项目中,PDF文档的结构可能因来源和版本而异,因此我们需要在代码中添加适当的异常处理来处理不同情况。
def extract_information_from_pdf(pdf_path):with pdfplumber.open(pdf_path) as pdf:total_pages = len(pdf.pages)extracted_data = []for page_number in range(total_pages):try:page = pdf.pages[page_number]text = page.extract_text()result = extract_information_from_text(text)if result:extracted_data.append(result)except Exception as e:print(f"Error processing page {page_number + 1}: {str(e)}")return extracted_data

通过添加异常处理,我们能够捕获并打印错误信息,同时继续处理其他页面,确保程序的鲁棒性。

17. 持续学习和实践

在编程和数据处理的领域中,持续学习和实践是非常关键的。不断挑战新的项目,学习新的技术和工具,参与开发者社区的讨论和贡献,将有助于提升你的技能水平。

  • 参与开源项目: 在GitHub等平台上,有许多与PDF处理相关的开源项目,可以参与其中,学习他人的代码风格和最佳实践。

  • 阅读相关文档和博客: 随着技术的不断更新,阅读相关文档和博客是了解最新技术动态和最佳实践的好方法。

  • 参与在线学习平台: 利用在线学习平台(如Coursera、edX、Udacity等),参加相关的课程和培训,提升自己的专业水平。

通过不断的学习和实践,你将能够更加熟练地处理各种数据处理任务,从而在实际项目中表现出色。祝你在编程和数据处理的旅程中取得更多成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/YTHu/3764.shtml

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

相关文章

华为OD机试真题-整数对最小和-2023年OD统一考试(C卷)-- Python3-开源

题目: 考察内容:双循环sortsum 代码: """ 题目分析: 求随机组合最小和 输入: 数组a个数, 数组元素 数组b个数,数组元素 对数个数输出: 和的最小值3 1 1 2 3 1 2 3…

时间获取、文件属性获取 2月20日学习笔记

执行两次代码&#xff0c;打印出两次执行过程中新增的文件及删除的文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <dirent.h>#def…

Docker容器实战

"爱在&#xff0c;地图上&#xff0c;剥落~" Mysql 容器化安装 我们可以在 docker hub上&#xff0c;进入mysql的镜像仓库&#xff0c;找到适合的版本。 直接拉取镜像: docker pull mysql:latest 我们知道 msyql 的默认端口是 3306 &#xff0c;而且有密码&#x…

MYSQL-入门

一.安装和连接 1.1 安装 mysql安装教程&#xff1a; 2021MySql-8.0.26安装详细教程&#xff08;保姆级&#xff09;_2021mysql-8.0.26安装详细教程(保姆级)_mysql8.0.26_ylb呀的博客-cs-CSDN博客 workbench安装&#xff1a; MySQL Workbench 安装及使用-CSDN博客 1.2 配…

强大的文本绘图——PlantUML

PlantUML是一款开源工具&#xff0c;它允许用户通过简单的文本描述来创建UML图&#xff08;统一建模语言图&#xff09;。这种方法可以快速地绘制类图、用例图、序列图、状态图、活动图、组件图和部署图等UML图表。PlantUML使用一种领域特定语言&#xff08;DSL&#xff09;&am…

本机防攻击简介

定义 在网络中&#xff0c;存在着大量针对CPU&#xff08;Central Processing Unit&#xff09;的恶意攻击报文以及需要正常上送CPU的各类报文。针对CPU的恶意攻击报文会导致CPU长时间繁忙的处理攻击报文&#xff0c;从而引发其他业务的中断甚至系统的中断&#xff1b;大量正常…

idea如何在一个service窗口中显示多个服务教程

idea在service窗口中显示多个服务 展示效果如下: 找到.idea > workspace.xml 中找到 RunDashboard 替换成如下 <component name"RunDashboard"><option name"configurationTypes"><set><option value"SpringBootApplicatio…

反序列化字符串逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 $_SESSION是访客与整个网站交互过程中一直存在的公有变量 然后看extract()函数的功能&#xff1a; extract($_POST)就是将post的内容作为这个函数的参数。 extract() 函数从数组中将变量导入到当前的符号表(本题的作用是将_SESSION的两个函数变为post传参) function…

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

氢气传感器与氢冷发电机:氢能应用中的关键技术及其安全监测

​ ​随着全球对可再生能源的迫切需求&#xff0c;氢能作为一种清洁、高效的能源形式&#xff0c;正逐渐受到人们的青睐。在氢能利用的过程中&#xff0c;氢气传感器和氢冷发电机成为了不可或缺的关键技术。然而&#xff0c;氢气作为一种易燃易爆的气体&#xff0c;其安全使…

P8630 [蓝桥杯 2015 国 B] 密文搜索

P8630 [蓝桥杯 2015 国 B] 密文搜索 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P8630 题目分析 基本上是hash的板子&#xff0c;但实际上对于密码串&#xff0c;只要判断主串中任意连续的八个位置是否存在密码串即可&#xff1b;那么我们…

svn客户端下载、安装、使用

下载、使用 打开360软件管家&#xff0c;选怎宝库&#xff0c;搜索svn&#xff0c;点击安装 可以修改安装路径 使用 在桌面右键弹出菜单&#xff0c;点击 输入地址&#xff0c;点击ok 输入用户名、密码 &#xff0c;等待检出完成

机器学习基础(四)非监督学习的进阶探索

导语&#xff1a;上一节我们详细探索监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;三&#xff09;监督学习的进阶探索-CSDN博客文章浏览阅读296次&#xff0c;点赞13次&#xff0c;收藏11次。监督学习作为机器学习的一个主要分支&#xff0c;…

基础中的基础!吴恩达deeplearning.ai:如何搭建一个神经网络

在前面几篇博客的学习之后&#xff0c;你应该了解了如何写出Tensorflow有关的代码&#xff0c;如何在Tensorflow中搭建一个层以及如何在Tensorflow之中实现前向推理&#xff08;链接&#xff09;&#xff0c;也了解了Tensorflow有关的数据形式&#xff08;链接&#xff09; 今天…

深度学习介绍

02-深度学习介绍 1 AI地图2 深度学习任务2.1 图片分类2.2 物体检测和分割2.3 样式迁移2.4 人脸合成2.5 文字生成图片2.6 文字生成2.7 无人驾驶 3 案例研究4 question 1 AI地图 自然语言处理是感知的范围&#xff0c;人几秒内科研感知。 2 深度学习任务 2.1 图片分类 https:/…

Linux离线安装插件

当公司Linux环境无外网情况下&#xff0c;需要先下载好离线安装包&#xff0c;然后上传到服务器&#xff0c;进行安装。 这里介绍一个下载插件安装包的网站&#xff0c;可以搜索到lrzsz、lsof、telnet、unzip、zip等安装包 搜索到想要的插件安装包后&#xff0c;下载并上传到服…

基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现

基于Java jspmysqlSpring的汽车出租平台租赁网站平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留…

【若依(ruoyi)】Java---如何在Apifox上传params参数--延伸--如何在Apifox上传Map类型参数

在使用若依开发过程中写接口的时候想在params中添加参数,但是使用params.key这种形式在后端是接收不到传过来的参数的,于是百般调研(百度),终于找到一个解决办法,就是在参数前后加上%5B和%5D,这两个参数会被编译为"["和"]",于是就对得上了,后端成功接受到参…

Covalent Network(CQT)发展新里程碑:SOC 2 数据安全认证通过,进一步加强了其人工智能支持

Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性审计&#xff0c;通过由备受行业认可的机构执行&#xff0c;进一步证明了 Covalent Network&#xff08;CQT&#xff09;团队坚定不移地致…

FlinkCDC详解

1、FlinkCDC是什么 1.1 CDC是什么 CDC是Chanage Data Capture&#xff08;数据变更捕获&#xff09;的简称。其核心原理就是监测并捕获数据库的变动&#xff08;例如增删改&#xff09;&#xff0c;将这些变更按照发生顺序捕获&#xff0c;将捕获到的数据&#xff0c;写入数据…
推荐文章