轻松解析 PDF 文档:深入了解 Python 的 pdfplumber 库

轻松解析 PDF 文档:深入了解 Python 的 pdfplumber

PDF 是一种常见的文件格式,广泛用于报告、文档、表单等领域。然而,如何高效解析 PDF 内容(尤其是文本和表格),一直是开发者面临的挑战。pdfplumber 是一个强大的 Python 库,专门用于从 PDF 文件中提取结构化数据,功能强大且易于使用。

在本文中,我们将详细介绍 pdfplumber 的功能和使用方法,并通过实际示例展示其在文本提取、表格解析等场景中的应用。


1. 什么是 pdfplumber?

pdfplumber 是基于 pdfminer.six 的 Python 库,它提供了更高级和友好的接口,适合处理以下任务:

  • 提取 PDF 文档中的 纯文本图片
  • 精确解析 表格数据
  • 提供对 PDF 页面布局的细粒度控制。

2. 安装 pdfplumber

安装 pdfplumber 非常简单,只需运行以下命令:

pip install pdfplumber

同时,它依赖 pillowpdfminer.six,安装过程中会自动处理。


3. 基本功能介绍

(1) 打开 PDF 文件

使用 pdfplumber.open() 可以轻松加载 PDF 文件。以下是简单的代码示例:

import pdfplumber# 打开 PDF 文件
with pdfplumber.open("example.pdf") as pdf:print(f"PDF 文档包含 {len(pdf.pages)} 页")

(2) 提取页面中的文本

可以按页提取 PDF 的纯文本:

# 提取第一页的文本
with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]text = page.extract_text()print("第一页文本内容:")print(text)

(3) 提取表格数据

如果 PDF 中包含表格,pdfplumber 可以将其解析为结构化数据:

with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]table = page.extract_table()print("表格内容:")for row in table:print(row)

4. 高级功能与应用

(1) 处理特定页面或区域

pdfplumber 提供了对页面布局的精确控制,可以提取特定区域的内容。例如,提取页面顶部的一部分文本:

# 提取特定区域的文本 (x0, y0, x1, y1)
with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]cropped = page.within_bbox((0, 0, 500, 100))text = cropped.extract_text()print("页面顶部的文本:")print(text)

(2) 提取图像

除了文本和表格,pdfplumber 还支持提取嵌入的图片:

with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]for img in page.images:print(f"图片信息:{img}")

(3) 导出页面的像素级图片

可以将页面导出为图片,方便进一步处理:

from PIL import Imagewith pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]page_image = page.to_image(resolution=150)  # 分辨率 150 DPIpage_image.save("page_image.png")

(4) 自定义表格解析

有时自动表格解析可能不准确,您可以通过手动调整表格边界来解析表格:

with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]# 定义表格区域 (x0, y0, x1, y1)table = page.extract_table({"vertical_strategy": "lines","horizontal_strategy": "lines","intersection_x_tolerance": 5,"intersection_y_tolerance": 5,})print("手动解析表格:")for row in table:print(row)

5. 示例应用场景

(1) 批量提取 PDF 文本

import os
import pdfplumber# 批量处理多个 PDF 文件
pdf_dir = "pdf_folder"
output_dir = "text_output"
os.makedirs(output_dir, exist_ok=True)for file_name in os.listdir(pdf_dir):if file_name.endswith(".pdf"):with pdfplumber.open(os.path.join(pdf_dir, file_name)) as pdf:all_text = ""for page in pdf.pages:all_text += page.extract_text()with open(os.path.join(output_dir, f"{file_name}.txt"), "w", encoding="utf-8") as f:f.write(all_text)

(2) 从发票中提取关键信息

import pdfplumber# 提取发票中的特定信息
with pdfplumber.open("invoice.pdf") as pdf:page = pdf.pages[0]text = page.extract_text()if "Invoice Number:" in text:invoice_number = text.split("Invoice Number:")[1].split("\n")[0].strip()print(f"发票号:{invoice_number}")

6. 注意事项与常见问题

(1) 表格解析不准确

  • 原因:表格线条不清晰或页面布局复杂。
  • 解决方法
    • 手动调整表格边界或策略(如 explicit_bboxsnap_tolerance)。
    • 使用其他表格解析工具(如 Tabula)结合 pdfplumber

(2) 无法提取嵌套文本

  • 原因:某些 PDF 文档采用复杂的嵌套格式。
  • 解决方法:结合 pdfminer 或导出页面为图片后用 OCR 工具(如 pytesseract)。


7. 实践与扩展

在实际应用中,pdfplumber 通常结合其他 Python 库(如 pandasnumpymatplotlib)使用,构建完整的数据处理和分析流程。以下是一些扩展应用场景的示例:

(1) 文档处理自动化

  • 使用 pdfplumber 批量提取合同、发票或报告中的关键数据。
  • 结合 pandas 将提取的数据结构化存储,方便进一步分析。
import pdfplumber
import pandas as pd# 批量提取发票编号和日期
data = []
with pdfplumber.open("invoices.pdf") as pdf:for page in pdf.pages:text = page.extract_text()if "Invoice Number:" in text and "Date:" in text:invoice_number = text.split("Invoice Number:")[1].split("\n")[0].strip()date = text.split("Date:")[1].split("\n")[0].strip()data.append({"Invoice Number": invoice_number, "Date": date})# 转为 DataFrame
df = pd.DataFrame(data)
print(df)
df.to_csv("invoices.csv", index=False)

(2) 表格数据清洗与可视化

  • 使用 pdfplumber 提取 PDF 表格后,可结合 matplotlibseaborn 进行数据可视化。
import pdfplumber
import pandas as pd
import matplotlib.pyplot as plt# 提取表格并清洗数据
with pdfplumber.open("report.pdf") as pdf:table = pdf.pages[0].extract_table()df = pd.DataFrame(table[1:], columns=table[0])# 转换列类型
df['Value'] = pd.to_numeric(df['Value'])# 数据可视化
df.plot(x='Category', y='Value', kind='bar', legend=False, title="Report Analysis")
plt.xlabel("Category")
plt.ylabel("Value")
plt.show()

(3) OCR 增强

  • 对于扫描版 PDF 或图片型 PDF,结合 pytesseract 进行 OCR 处理,弥补纯文字解析的不足。
import pdfplumber
from PIL import Image
import pytesseract# 使用 pdfplumber 提取图像
with pdfplumber.open("scanned.pdf") as pdf:for page in pdf.pages:page_image = page.to_image()page_image.save("temp_page.png")# OCR 提取文字text = pytesseract.image_to_string(Image.open("temp_page.png"))print("OCR 提取文本:")print(text)

8. 总结与展望

pdfplumber 是解析 PDF 文档的利器,凭借其高效的文本和表格解析能力,为文档自动化处理提供了极大的便利。然而,在复杂布局或扫描版 PDF 场景下,其功能可能受限,适当结合 OCR 工具(如 pytesseract)可以实现更全面的解析。

未来扩展

  • 与大数据工具结合:将解析结果直接存入数据库(如 MongoDB、MySQL)或大数据平台。
  • 集成机器学习:将解析结果作为训练数据,开发文档分类或表单智能识别模型。
  • 构建全自动工作流:与调度工具(如 Airflow)集成,实现文档处理流水线。

无论您是新手还是资深开发者,pdfplumber 都可以成为处理 PDF 数据的得力助手。在未来的数据处理项目中,您一定能感受到它的强大与灵活性。希望这篇文章为您提供了清晰的思路和实用的代码示例!

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

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

相关文章

Windows系统运行库软件游戏修复工具

本页面下载的资源包包括PC电脑常用的运行库和电脑必备组件,如您的电脑出现应用打不开,缺少dll链接库、闪退等现象可以尝试用下面软件修复。 本资源永久有效。 软件安装基本常识科普: 为什么要安装运行库?运行库默认安装到C盘&…

wireshark使用lua解析自定义协议

wireshark解析自定义协议 1.自定义的lua放入路径2.修改init.lua2.1 开启lua2.2 init.lua文件最后加入自己的lua文件位置,这里需要确保与自己的文件名相同 3.编写lua4.编写c抓包5.wireshark添加自定义协议如何加调试信息 1.自定义的lua放入路径 一般是自己软件的安装…

ISAAC Gym 7. 使用箭头进行数据可视化

在这里发布一个ISAAC GYM可以使用的箭头绘制类。 gymutil默认有WireframeBoxGeometry,WireframeBBoxGeometry, WireframeSphereGeometry三个线段集生成函数,可以绘制盒子和球体。绘制函数分别有draw_lines和draw_line。 同理,使…

【计算机网络】网段划分

一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号 互联网中的每一台主机,都要隶属于某一个子网 -&…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…

MySQL数据库设计

数据库设计 数据库是用来存在数据的&#xff0c;需要设计合理的数据表来存放数据–能够完成数据的存储&#xff0c;同时能够方便的提取应该系统所需的数据 1. 数据库的设计流程 数据库是为应用系统服务的&#xff0c;数据库的数据存储也是由应用系统决定的 当我们进行应用系统开…

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0&#xff1a;构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布&#xff0c;我们迎来了许多新特性和改进&#xff0c;其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…

数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图

目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy ​编辑 3.使用DataFrame ​编辑 二、绘制条形图&#xff08;柱状图&#xff09; 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 ​编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…

logback 初探学习

logback 三大模块 记录器&#xff08;Logger&#xff09;、追加器&#xff08;Appender&#xff09;和布局&#xff08;Layout&#xff09; 配置文件外层最基本的标签如图示 xml中定义的就是这个三个东西下面进入学习 包引入参考springboot 官方文档 Logging :: Spring Boo…

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…

《图像梯度与常见算子全解析:原理、用法及效果展示》

简介:本文深入探讨图像梯度相关知识&#xff0c;详细介绍图像梯度是像素灰度值在不同方向的变化速度&#xff0c;并以 “pig.JPG” 图像为例&#xff0c;通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子&#xff0c…

项目进度计划表:详细的甘特图的制作步骤

甘特图&#xff08;Gantt chart&#xff09;&#xff0c;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;发明&#xff0c;是一种通过条状图来…

A045-基于spring boot的个人博客系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现

一、编码问题 在计算机编程中&#xff0c;流&#xff08;Stream&#xff09;是一种抽象的概念&#xff0c;用于表示数据的输入或输出。根据处理数据的不同方式&#xff0c;流可以分为字节流&#xff08;Byte Stream&#xff09;和字符流&#xff08;Character Stream&#xff0…

Python爬虫项目 | 二、每日天气预报

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果1.3.1 编辑器内打印显示效果实际应用效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 获取天气预报信息2.2.2 获取当天日期信息&#xff0c;格式化输出2.2.3 调用函数&#xff0c;输出结果 2.3 过程展示 3 总结 1…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻&#xff0c;今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”&#xff0c;百度文心智能体平台入选。 这个智能体平台我最近也有所关注&#xff0c;接下来我就来讲讲它。 百度在下一盘大棋…

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取

文章目录 1、前言2、在UG NX中创建平面和一个长方体,3、在UI Styler中创建一个UI界面4、在VS中创建一个工程4.1 创建并添加工程文件4.2 在Update_cb方法中添加选择平面的代码4.3 编译完成并测试效果1、前言 在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的…

【软考】数据库

1. 数据模型 1.1 概念数据模型 概念数据模型一般用 E-R 图表示&#xff0c;常用术语如下&#xff1a; 实体&#xff1a;客观存在的事物&#xff0c;如&#xff1a;一个单位、一个职工、一个部门、一个项目。属性&#xff1a;学生实体有学号、姓名、出生日期等属性。码&#…

【强化学习的数学原理】第04课-值迭代与策略迭代-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、值迭代算法二、策略迭代算法三、截断策略迭代算法四、本节课内容summary 一、值迭代算法 值迭代算法主要包括两部分。 第一…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…