python应用之使用pdfplumber 解析pdf文件内容

目录标题

  • 一. 通过 pdfplumber.open() 解析复杂PDF:
    • 1-2. 报错:
        • V2 :
    • 1-3. v3 使用tk 库,弹框选择文件
      • 运行环境准备
      • 完整代码保存
      • 运行测试步骤
        • 方式二:命令行方式(适用于自动化)
      • 测试用例示例
      • 常见问题排查
        • 1. 无文件选择对话框弹出:
        • 2. No such file or directory错误:
        • 3. 提取内容为空:
        • 4. 内存不足错误:
      • 扩展测试建议
    • 1-10 总结:
  • 二. PDF中包含表格,table = first_page.extract_table() 只能提取到 PDF文件中的表头如下:
        • 1. 表格结构识别问题
        • 解决办法
        • 2. 文本布局问题
        • 解决办法
        • 3. 字体和颜色问题
        • 解决办法

一. 通过 pdfplumber.open() 解析复杂PDF:

这段 Python 代码使用了 pdfplumber 库来读取 PDF 文件中的文本内容,下面是逐行解释:

import pdfplumber
  • 引入 pdfplumber 模块,这是一个用于从 PDF 文件中提取文本、表格等内容的第三方库。
# 打开 PDF 文件, 这里写死了,看下面的V2版本,用弹框选择文件
with pdfplumber.open("example.pdf") as pdf:
  • 使用 pdfplumber.open() 方法打开名为 "example.pdf" 的 PDF 文件。
  • 使用 with 语句可以确保文件使用完后会自动关闭,避免资源泄露。
    # 获取第一页page = pdf.pages[0]
  • 获取 PDF 文件的第一页内容,pdf.pages 是一个页面对象的列表,索引从 0 开始。
    # 提取文本text = page.extract_text()
  • 调用 extract_text() 方法从第一页中提取文本内容。
  • 这个方法返回一个字符串,包含该页的所有可提取文本(按照排版顺序)。
    print(text)
  • 将提取到的文本打印出来。

1-2. 报错:

ImportError: DLL load failed while importing _rust: 找不到指定的程序。
Traceback:
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\ltjt_ai_seek_app\com\szkj\test_pdf\pdf_parser.py", line 2, in <module>import pdfplumber
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfplumber\__init__.py", line 15, in <module>from .pdf import PDF
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfplumber\pdf.py", line 8, in <module>from pdfminer.layout import LAParams
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfminer\layout.py", line 21, in <module>from pdfminer.pdfinterp import Color, PDFGraphicState
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfminer\pdfinterp.py", line 10, in <module>from pdfminer.pdfdevice import PDFDevice, PDFTextSeq
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfminer\pdfdevice.py", line 16, in <module>from pdfminer.pdfpage import PDFPage
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfminer\pdfpage.py", line 6, in <module>from pdfminer.pdfdocument import (
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\pdfminer\pdfdocument.py", line 23, in <module>from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\cryptography\hazmat\primitives\ciphers\__init__.py", line 11, in <module>from cryptography.hazmat.primitives.ciphers.base import (
File "D:\Users\wang\PycharmProjects\github\ltkj-aiseek\seek_backend_py\.venv\lib\site-packages\cryptography\hazmat\primitives\ciphers\base.py", line 10, in <module>from cryptography.hazmat.bindings._rust import openssl as rust_openssl

你遇到的 ImportError: DLL load failed while importing _rust: 找不到指定的程序 错误通常是由于缺少某些依赖项或环境配置问题导致的。以下是一些可能的解决方案:

  1. 确保安装了所有必要的依赖项
    确保你已经安装了所有必要的依赖项,特别是 cryptography 和 pdfplumber。你可以使用以下命令来安装这些库:
pip install pdfplumber cryptography
  1. 安装 Visual C++ Redistributable
    有时,这个错误是由于缺少 Microsoft Visual C++ Redistributable 包引起的。你可以从微软官方网站下载并安装最新版本的 Visual C++ Redistributable for Visual Studio 2015, 2017, 2019 或 2022。
Visual C++ Redistributable for Visual Studio 2015, 2017, and 2019
Visual C++ Redistributable for Visual Studio 2022
  1. 检查 Python 和 pip 的版本
    确保你使用的是兼容的 Python 和 pip 版本。你可以使用以下命令来检查和升级它们:
python --version
pip --version
pip install --upgrade pip
  1. 重新安装 cryptography 库
    有时,重新安装 cryptography 库可以解决问题。你可以使用以下命令来卸载并重新安装它:
pip uninstall cryptography
pip install cryptography

如果都安装了,还是报错,那就是python版本的问题:
从3.9 -> 3.12 ,换完之后 ,成功
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

验证 安装成功
pip show pdfplumber

linux下 一样,pdfplumber 好像需要python3.12 版本:

在这里插入图片描述

V2 :

~~~

代码如下:

import streamlit as st
import pdfplumber
import io# 设置页面标题
st.title("PDF 文本提取工具")# 创建文件上传组件
uploaded_file = st.file_uploader("请选择一个 PDF 文件", type=["pdf"])if uploaded_file is not None:# 读取上传的文件file_bytes = uploaded_file.read()# 转换为类文件对象file_stream = io.BytesIO(file_bytes)# 使用 pdfplumber 打开 PDF 文件with pdfplumber.open(file_stream) as pdf:# 获取第一页page = pdf.pages[0]# 提取文本text = page.extract_text()# 显示提取的文本if text:st.subheader("提取的文本内容:")st.write(text)else:st.warning("未能从该页提取到任何文本。")
else:st.info("请上传一个 PDF 文件以开始提取文本。")

在这里插入图片描述

提取的文本内容:
文旅投集团专属会员权益服务内容 类型 名称 项目 具体商品/服务 收费标准 权益折扣 工作日(6:00-17:00) 150元/小时 工作日(17:00-22:00) 200元/小时 周末及节假日(6:00-17:00) 200元/小时 网球项目 8.5折 室内网球 周末及节假日(17:00-22:00) 240元/小时 工作日(6:00-9:00)晨间畅打 399元/10次 工作日(12:00-14:00)午间畅打 299元/10次 工作日(6:00-17:00) 80元/小时 网球项目 工作日(17:00-22:00) 100元/小时 8.5折 室外网球 周末及节假日(6:00-22:00) 100元/小时 工作日(6:00-12:00) 40元/小时 工作日(12:00-17:00) 60元/小时 工作日(17:00-22:00) 80元/小时 多功能馆 8.5折 羽毛球 文 周末及节假日(6:00-22:00) 80元/小时 中央绿色 体 体育公园 类 工作日(6:00-9:00)晨间畅打 15元/人 工作日(6:00-9:00)晨间畅打次卡 288元/30次 多功能馆 全时段(6:00-22:00) 半场200元/小时 8.5折 室内篮球 工作日(6:00-12:00) 20元/小时 工作日(12:00-22:00) 25元/小时 周末及节假日(6:00-12:00) 25元/小时 乒乓球馆 周末及节假日(12:00-22:00) 30元/小时 8.5折 乒乓球 工作日(6:00-9:00)畅打次卡 120元/30次 工作日(9:00-12:00)畅打次卡 150元/30次 工作日(19:00-22:00)畅打次卡 198元/30次 工作日(6:00-17:00) 300元/小时 室外场地 工作日(17:00-22:00) 400元/小时 8.5折 11人制足球 周末及节假日(6:00-22:00) 400元/小时

在这里插入图片描述

1-3. v3 使用tk 库,弹框选择文件

以下是运行完整示例程序并进行测试的详细步骤说明:

运行环境准备

  1. 安装依赖库:

pip install pdfplumber tk
  • pdfplumber:用于PDF解析

  • tk:用于图形界面(Python自带,但部分Linux系统可能需要单独安装)

  • 准备测试文件:

  • 准备一个测试用的PDF文件(建议同时准备正常PDF和错误文件用于测试异常处理)

完整代码保存

新建一个.py文件(如pdf_extractor.py),粘贴以下代码:


import pdfplumber
import io
import tkinter as tk
from tkinter import filedialog# 创建隐藏的根窗口
root = tk.Tk()
root.withdraw()# 打开文件选择对话框
file_path = filedialog.askopenfilename(title="选择PDF文件",filetypes=[("PDF文件", "*.pdf")]
)if not file_path:print("未选择文件")exit()try:# 先读取为字节数据with open(file_path, "rb") as f:file_bytes = f.read()# 转换为类文件对象file_stream = io.BytesIO(file_bytes)# 解析PDFwith pdfplumber.open(file_stream) as pdf:first_page = pdf.pages[0]print("="*30 + "\n提取的文本内容:\n" + "="*30)print(first_page.extract_text() or "未检测到文本内容")except Exception as e:print(f"处理文件时出错:{str(e)}")

运行测试步骤

####. 方式一:图形界面方式(推荐)
启动程序:


python pdf_extractor.py
  1. 选择文件:
  • 将自动弹出文件选择对话框
  • 选择准备好的测试PDF文件(建议选择包含可识别文本的简单PDF)
  1. 查看输出:

==============================
提取的文本内容:
==============================
这里是PDF第一页的文本内容...
方式二:命令行方式(适用于自动化)

python pdf_extractor.py "/path/to/your/file.pdf"

测试用例示例

测试场景预期结果验证点
---------------------
选择正常PDF文件正确输出第一页文本文本提取功能正常
取消文件选择输出"未选择文件"并退出异常处理逻辑正常
选择非PDF文件(如.jpg)弹出错误提示文件类型过滤有效
选择加密的PDF文件抛出解密错误异常处理机制有效
选择损坏的PDF文件显示解析错误信息健壮性验证

常见问题排查

1. 无文件选择对话框弹出:
  • 检查是否安装了图形界面支持
  • 在Linux服务器环境可使用以下命令安装基础GUI支持:

sudo apt-get install python3-tk
2. No such file or directory错误:
  • 确认文件路径是否正确
  • 检查文件权限设置
3. 提取内容为空:
  • 测试文件是否是扫描版图片PDF(需要OCR处理)
  • 尝试使用官方测试文件:

# 测试代码
import pdfplumber
with pdfplumber.open("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf") as pdf:print(pdf.pages[0].extract_text())
4. 内存不足错误:

对于超大PDF文件(>100MB),改用文件路径方式打开:


# 替代BytesIO的方式
with pdfplumber.open(file_path) as pdf:# 处理逻辑

扩展测试建议

  1. 多页测试:

# 修改代码遍历所有页面
for i, page in enumerate(pdf.pages):print(f"第 {i+1} 页内容:")print(page.extract_text())
  1. 表格提取测试: TODO 看看能不能 弥补上面 V2 解析结果错乱的问题

# 在with语句中添加
table = first_page.extract_table()
if table:print("\n检测到表格:")for row in table:print(row)
  1. 性能测试:

import time
start = time.time()
# 处理代码
print(f"处理耗时:{time.time()-start:.2f}秒")

通过以上步骤可以完整验证PDF文本提取功能的可用性和健壮性。

1-10 总结:

这段代码实现了从一个名为 example.pdf 的 PDF 文件中提取第一页的文本,并将其输出到控制台。它适合用于快速查看或处理 PDF 中的文本信息。

如果你有 PDF 文件想解析或提取特定内容,也可以告诉我,我可以帮你构建更复杂的提取逻辑。

二. PDF中包含表格,table = first_page.extract_table() 只能提取到 PDF文件中的表头如下:

提取的文本内容:
==============================
['类型', '名称', '项目', '具体商品/服务', '收费标准', '权益折扣']

表格里的单元格数据 提取不到

1. 表格结构识别问题

pdfplumber 是基于规则来识别表格的,若表格的结构较为复杂或者不规则,它可能无法正确识别表格的边界,进而导致只能提取到表头。

解决办法

调整表格检测参数:可以通过修改 table_settings 参数来调整表格检测的规则。例如,修改 vertical_strategy 和 horizontal_strategy 参数,让其能更精准地识别表格的边界。

import pdfplumberpdf_path = 'your_pdf_file.pdf'
with pdfplumber.open(pdf_path) as pdf:first_page = pdf.pages[0]# 调整表格检测参数table_settings = {"vertical_strategy": "text","horizontal_strategy": "text"}table = first_page.extract_table(table_settings)for row in table:print(row)

效果:
在这里插入图片描述
有单元格内容,也能成行成行打印了,但是对于前2列 是合并行的单元格,还不友好。

2. 文本布局问题

若表格中的文本布局比较特殊,例如存在合并单元格、跨页表格等情况,pdfplumber 可能难以正确识别表格的结构。

解决办法
  • 手动指定表格区域:可以通过指定表格的坐标区域来精确提取表格数据。你可以使用 pdfplumber 的 crop() 方法来裁剪页面,只保留表格所在的区域。
    生成 pdf_table_extraction_manual.py。 未测试验证
import pdfplumberpdf_path = 'your_pdf_file.pdf'
with pdfplumber.open(pdf_path) as pdf:first_page = pdf.pages[0]# 手动指定表格区域的坐标(x0, top, x1, bottom)table_bbox = (100, 200, 500, 400)cropped_page = first_page.crop(table_bbox)table = cropped_page.extract_table()for row in table:print(row)
3. 字体和颜色问题

如果表格中的文本使用了特殊的字体或者颜色,pdfplumber 在识别文本时可能会出现问题。

解决办法
  • 检查 PDF 文件:尝试使用 PDF 阅读器打开文件,查看表格中的文本是否能够正常显示。若文本显示存在问题,可以尝试重新生成 PDF 文件。

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

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

相关文章

力扣热题100刷题day61|234.回文链表(两种方法)

一、回文链表 234.回文链表 两种解法 解法1&#xff1a;时间复杂度O(n) 空间复杂度O(n) 遍历链表&#xff0c;计算链表长度&#xff0c;创建同样长度大小的数组&#xff0c;用数组存储链表中所有元素&#xff0c;之后双指针遍历链表&#xff0c;一个从头开始&#xff0c;一…

vue3+element-plus动态与静态表格数据渲染

一、表格组件&#xff1a; <template> <el-table ref"myTable" :data"tableData" :header-cell-style"headerCellStyle" header-row-class-name"my-table-header" cell-class-name"my-td-cell" :row-style"r…

Kafka 中的生产者分区策略

Kafka 中的 生产者分区策略 是决定消息如何分配到不同分区的机制。这个策略对 Kafka 的性能、负载均衡、消息顺序性等有重要影响。了解它对于高效地使用 Kafka 进行消息生产和消费至关重要。 让我们一起来看 Kafka 中 生产者的分区策略&#xff0c;它如何工作&#xff0c;以及…

《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 《从零搭建Vue3项目实战》&#xff08;AI辅助…

全国产FMC子卡-16bit 8通道2.4G

国产化FMC DA子卡&#xff0c;16bit 8通道2.4GS/s 全国产FMC子卡是一款高分辨率、高采样率的全国产多通道标准双宽DAC FMC子板。其接口电气和结构设计均依据FMC标准(ANSI/VITA 57.1)&#xff0c;通过两个高密度FMC连接器&#xff08;HPC&#xff09;连接至FPGA载板。它提供8路A…

linux-添加开机自启动指定脚本

一、systemd 服务&#xff08;主流方法&#xff09; 适用于使用systemd的现代发行版&#xff08;Ubuntu 16.04/CentOS 7&#xff09; 创建服务文件 sudo nano /etc/systemd/system/your_script.service写入服务配置&#xff08;示例&#xff09;&#xff1a; [Unit] Descri…

Spring MVC 返回 JSON 视图的方式及对比(6种)

Spring MVC 返回 JSON 视图的方式及对比&#xff08;新增 MappingJackson2JsonView&#xff09; 1. 方式一&#xff1a;ResponseBody 注解 作用&#xff1a;直接返回对象&#xff0c;由消息转换器&#xff08;如 Jackson&#xff09;序列化为 JSON。 适用场景&#xff1a;简单…

瑞芯微RK3568嵌入式AI项目实战:智能家居项目(二)

RK3568智能家居项目实战指南&#xff1a;从入门到精通的完整制作流程 瑞芯微RK3568作为一款高性能嵌入式处理器&#xff0c;凭借其四核Cortex-A55架构、1T算力NPU和丰富的外设接口&#xff0c;成为智能家居项目开发的理想平台。下面我将推荐几个典型的RK3568智能家居项目&…

GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147049923 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

Spring Boot 3.4.3 和 Spring Security 6.4.2 实现基于内存和 MySQL 的用户认证

在 Web 应用开发中&#xff0c;用户认证是保障系统安全的基础需求。Spring Boot 3.4.3 结合 Spring Security 6.4.2 提供了强大的安全框架支持&#xff0c;可以轻松实现基于内存或数据库的用户认证功能。本文将详细介绍如何在 Spring Boot 3.4.3 中集成 Spring Security 6.4.2&…

HOW - Axios 拦截器特性

目录 Axios 介绍拦截器特性1. 统一添加 Token&#xff08;请求拦截器&#xff09;2. 处理 401 未授权&#xff08;响应拦截器&#xff09;3. 统一处理错误信息&#xff08;响应拦截器&#xff09;4. 请求 Loading 状态管理5. 自动重试请求&#xff08;如 429 过载&#xff09;6…

JVM核心机制:类加载×字节码引擎×垃圾回收机制

&#x1f680;前言 “为什么你的Spring应用启动慢&#xff1f;为什么GC总是突然卡顿&#xff1f;答案藏在JVM的核心机制里&#xff01; 本文将用全流程图解字节码案例&#xff0c;带你穿透三大核心机制&#xff1a; 类加载&#xff1a;双亲委派如何防止恶意代码入侵&#xff…

coze生成流程图和思维导图工作流

需求&#xff1a;通过coze平台实现生成流程图和思维导图&#xff0c;要求支持文档上传 最终工作流如下&#xff1a; 入参&#xff1a; 整合用户需求文件内容的工作流&#xff1a;https://blog.csdn.net/YXWik/article/details/147040071 选择器分发&#xff0c;不同的类型走…

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…

SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作

以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的详细使用说明&#xff0c;包含代码示例和场景说明&#xff1a; 1. 什么是 TypedTuple 和 DefaultTypedTuple&#xff1f; TypedTuple<T> 接口&#xff1a; 定义了 Redis 中有序集合&#xff08;ZSet…

递归实现组合型枚举(DFS)

从 1∼n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。 输入格式 两个整数 n,m,在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行内的数升序排列&#xff0c;相邻两个数用一个空格隔开。…

CentOS 7 镜像源失效解决方案(2025年)

执行 yum update 报错&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 脚手架初始化项目生成文件的介绍

文章目录 一、介绍二、举例说明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 编译和运行A-LOAM

1.搭建文件目录和clone代码 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代码文件 2.1 由于PCL版本1.10&#xff0c;将CMakeLists.txt中的C标准改为14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…