轻松解析 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 Image

with pdfplumber.open("example.pdf") as pdf:
    page = pdf.pages[0]
    page_image = page.to_image(resolution=150)  # 分辨率 150 DPI
    page_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 数据的得力助手。在未来的数据处理项目中,您一定能感受到它的强大与灵活性。希望这篇文章为您提供了清晰的思路和实用的代码示例!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Charles抓包工具-笔记

摘要 概念: Charles是一款基于 HTTP 协议的代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果来达到分析抓包的目的。 功能: Charles 是一个功能全面的抓包工具,适用于各种网络调试和优化场景。 它…

java: itext8.05 create pdf

只能调用windows 已安装的字体,这样可以在系统中先预装字体,5.0 可以调用自配文件夹的字体文件。CSharp donetItext8.0 可以调用。 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司 言語成了邀功盡責的功臣,還需要行爲每日來值班…

Kafka 生产者优化与数据处理经验

Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

C高级学习笔记

……接上文 硬链接和软连接(符号链接) 硬链接 硬链接文件可以理解为文件的副本(可以理解为复制粘贴) ln 根据Linux系统分配给文件的inode(ls -li)号进行建立,没有办法跨越文件系统 格式:ln 被链接的文件&am…

Java基于SpringBoot+Vue的藏区特产销售平台

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

vim 分割窗口后,把状态栏给隐藏

一、基本环境 主机MacOs Sonoma 14.7主机终端Iterm2虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 最小安装 二、分割窗口后的截图,红色线条部分就是状态栏 分割后个布局是:顶部1行高度窗口&#x…

【数据结构】【线性表】栈的基本概念(附c语言源码)

栈的基本概念 讲基本概念还是回到数据结构的三要素:逻辑结构,物理结构和数据运算。 从逻辑结构来讲,栈的各个数据元素之间是通过是一对一的线性连接,因此栈也是属于线性表的一种从物理结构来说,栈可以是顺序存储和顺…

OpenOCD之J-Link下载

1.下载USB Dirver Tool.exe,选择J-Link dirver,替换成WinUSB驱动。(⭐USB Dirver Tool工具可将J-Link从WinUSB驱动恢复为默认驱动⭐) 下载方式 ①官方网址:https://visualgdb.com/UsbDriverTool/ ②笔者的CSDN链接&…

【JavaEE初阶 — 多线程】定时器的应用及模拟实现

目录 1. 标准库中的定时器 1.1 Timer 的定义 1.2 Timer 的原理 1.3 Timer 的使用 1.4 Timer 的弊端 1.5 ScheduledExecutorService 2. 模拟实现定时器 2.1 实现定时器的步骤 2.1.1 定义类描述任务 定义类描述任务 第一种定义方法 …

ssm168基于jsp的实验室考勤管理系统网页的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:实验室考勤管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本实验室考勤管…

原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型

无论是在什么手机机型下,自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12,13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意:红色阔里的是自定义导航(或者其他的logo啊,返回之…

Python 获取微博用户信息及作品(完整版)

在当今的社交媒体时代,微博作为一个热门的社交平台,蕴含着海量的用户信息和丰富多样的内容。今天,我将带大家深入了解一段 Python 代码,它能够帮助我们获取微博用户的基本信息以及下载其微博中的相关素材,比如图片等。…

springcloud alibaba之shcedulerx实现分布式锁

文章目录 1、shcedulerx简介2、基于mysq分布式锁实现3、注解方式使用分布式锁4、编码方式使用分布式锁 1、shcedulerx简介 springcloud alibaba shcedulerx看起来有点像xxl job那样的任务调度中间件,其实它是一个分布式锁框架,含有两种实现一种基于DB实…

【LLM训练系列02】如何找到一个大模型Lora的target_modules

方法1:观察attention中的线性层 import numpy as np import pandas as pd from peft import PeftModel import torch import torch.nn.functional as F from torch import Tensor from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig from typ…

Selenium的八种定位方式

1. 通过 ID 定位 ID 是最直接和高效的方式来定位元素,因为每个页面中的 ID 应该是唯一的。 from selenium import webdriverdriver webdriver.Chrome(executable_pathpath/to/chromedriver) driver.get(https://example.com)# 通过 ID 定位 element driver.find…

MySQL底层概述—1.InnoDB内存结构

大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer 1.InnoDB引擎架构 (1)InnoDB引擎架构图 (2)InnoDB内存结构 (1)InnoDB引擎架构图 下面是InnoDB引擎架构图,主要分为内存结构和磁…

丹摩|丹摩智算平台深度评测

1. 丹摩智算平台介绍 随着人工智能和大数据技术的快速发展,越来越多的智能计算平台涌现,为科研工作者和开发者提供高性能计算资源。丹摩智算平台作为其中的一员,定位于智能计算服务的提供者,支持从数据处理到模型训练的全流程操作…

基于企业微信客户端设计一个文件下载与预览系统

在企业内部沟通与协作中,文件分享和管理是不可或缺的一部分。企业微信(WeCom)作为一款广泛应用于企业的沟通工具,提供了丰富的API接口和功能,帮助企业进行高效的团队协作。然而,随着文件交换和协作的日益增…

LLM的原理理解6-10:6、前馈步骤7、使用向量运算进行前馈网络的推理8、注意力层和前馈层有不同的功能9、语言模型的训练方式10、GPT-3的惊人性能

目录 LLM的原理理解6-10: 6、前馈步骤 7、使用向量运算进行前馈网络的推理 8、注意力层和前馈层有不同的功能 注意力:特征提取 前馈层:数据库 9、语言模型的训练方式 10、GPT-3的惊人性能 一个原因是规模 大模型GPT-1。它使用了768维的词向量,共有12层,总共有1.…

大模型系列11-ray

大模型系列11-ray PlasmaPlasmaStore启动监听处理请求 ProcessMessagePlasmaCreateRequest请求PlasmaCreateRetryRequest请求PlasmaGetRequest请求PlasmaReleaseRequestPlasmaDeleteRequestPlasmaSealRequest ObjectLifecycleManagerGetObjectSealObject ObjectStoreRunnerPlas…