目录

    • 专栏导读
    • 概述
    • 主要工具库介绍
      • 1. tabula-py
      • 2. camelot-py
      • 3. pdfplumber
      • 4. PyMuPDF (fitz)
    • 环境准备
      • 安装依赖
      • Java环境配置(tabula-py需要)
    • 方法一:使用tabula-py提取表格
      • 基础用法
      • 高级配置
    • 方法二:使用camelot-py提取表格
    • 方法三:使用pdfplumber提取表格
    • 批量处理多个PDF文件
    • 数据后处理和清洗
    • 完整的批量处理脚本
    • 使用示例
    • 常见问题和解决方案
      • 1. Java环境问题
      • 2. 表格识别不准确
      • 3. 内存不足
      • 4. 中文编码问题
    • 性能优化建议
    • 总结
    • 结尾

专栏导读

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

概述

在日常工作中,我们经常需要从PDF文件中提取表格数据进行分析。手动复制粘贴不仅效率低下,还容易出错。本文将介绍如何使用Python自动化批量提取PDF中的表格数据,并将其转换为可处理的格式。

主要工具库介绍

1. tabula-py

  • 优势:专门用于PDF表格提取,功能强大
  • 特点:基于Java的tabula库,支持复杂表格结构
  • 适用场景:结构化表格,边框清晰的PDF

2. camelot-py

  • 优势:高精度表格提取,支持表格质量评估
  • 特点:提供多种提取策略,可视化调试
  • 适用场景:高质量PDF文档,需要精确提取

3. pdfplumber

  • 优势:轻量级,易于使用
  • 特点:可以提取文本、表格和图像信息
  • 适用场景:简单表格,文本密集型PDF

4. PyMuPDF (fitz)

  • 优势:功能全面,性能优秀
  • 特点:支持多种PDF操作,包括表格提取
  • 适用场景:复杂PDF处理需求

环境准备

安装依赖

# 安装tabula-py(需要Java环境)
pip install tabula-py# 安装camelot-py
pip install camelot-py[cv]# 安装pdfplumber
pip install pdfplumber# 安装PyMuPDF
pip install PyMuPDF# 安装pandas用于数据处理
pip install pandas# 安装其他辅助库
pip install openpyxl xlsxwriter

Java环境配置(tabula-py需要)

# 检查Java版本
java -version# 如果没有Java,需要安装JDK 8或更高版本

方法一:使用tabula-py提取表格

基础用法

import tabula
import pandas as pd
import os
from pathlib import Pathdef extract_tables_with_tabula(pdf_path, output_dir):"""使用tabula-py提取PDF中的表格Args:pdf_path: PDF文件路径output_dir: 输出目录"""try:# 提取所有表格tables = tabula.read_pdf(pdf_path, pages='all', multiple_tables=True)pdf_name = Path(pdf_path).stem# 保存每个表格for i, table in enumerate(tables):if not table.empty:output_file = os.path.join(output_dir, f"{pdf_name}_table_{i+1}.xlsx")table.to_excel(output_file, index=False)print(f"表格 {i+1} 已保存到: {output_file}")return len(tables)except Exception as e:print(f"处理文件 {pdf_path} 时出错: {str(e)}")return 0# 使用示例
pdf_file = "example.pdf"
output_directory = "extracted_tables"
os.makedirs(output_directory, exist_ok=True)table_count = extract_tables_with_tabula(pdf_file, output_directory)
print(f"共提取了 {table_count} 个表格")

高级配置

def advanced_tabula_extraction(pdf_path, output_dir):"""高级tabula提取配置"""try:# 自定义提取参数tables = tabula.read_pdf(pdf_path,pages='all',multiple_tables=True,lattice=True,  # 使用格线检测stream=False,  # 不使用流模式guess=True,    # 自动猜测表格区域pandas_options={'header': 0}  # 设置第一行为表头)pdf_name = Path(pdf_path).stemfor i, table in enumerate(tables):if not table.empty:# 数据清洗table = table.dropna(how='all')  # 删除全空行table = table.dropna(axis=1, how='all')  # 删除全空列# 保存为多种格式base_name = f"{pdf_name}_table_{i+1}"# Excel格式excel_file = os.path.join(output_dir, f"{base_name}.xlsx")table.to_excel(excel_file, index=False)# CSV格式csv_file = os.path.join(output_dir, f"{base_name}.csv")table.to_csv(csv_file, index=False, encoding='utf-8-sig')print(f"表格 {i+1} 已保存: {base_name}")return len(tables)except Exception as e:print(f"处理失败: {str(e)}")return 0

方法二:使用camelot-py提取表格

import camelot
import pandas as pddef extract_tables_with_camelot(pdf_path, output_dir):"""使用camelot-py提取PDF表格"&

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

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

相关文章

MySQL自定义order by排序规则

数据表create table tb_user (id bigint auto_incrementprimary key,name varchar(16) not null,age int not null,address varchar(128) null );INSERT INTO test.tb_user (id, name, age, address) VALUES (1, 张三, 18, China); INSERT INTO test.tb_…

112套开题答辩行业PPT模版

毕业答辩开题报告,毕业答辩,论文设计PPT,清新论文答辩PPT模版,毕业论文答辩开题报告PPT,答辩演讲通用PPT模版,文艺时尚毕业答辩PPT模版,简约毕业论文答辩PPT模版112套开题答辩行业PPT模版&#…

驱动开发系列61- Vulkan 驱动实现-SPIRV到HW指令的实现过程(2)

本节继续介绍下SPIR-V到LLVM IR的转换过程,重点分析其核心机制和关键转换步骤。我们将从 LLVM 入手,结合实SPIR-V结构逐步转换为符合 LLVM IR 语义的表示方式。 一:详细过程 1. 创建llvm::module llvm::LLVMContext llvmContext; std::unique_ptr<llvm::Mod…

集训Demo2

做一个类似原神圣遗物生成、穿戴、卸下的案例创建项目创建数据库添加圣遗物获取4个数字&#xff0c;对应圣遗物随机的四种属性构造对象添加批量删除圣遗物foreach构造数组转移圣遗物分别在items和character两个库中根据id获取对象&#xff0c;判断唯一id存在哪个数据库中在item…

RedisJSON 技术揭秘`JSON.CLEAR` 一键清空容器、重置数字的“软删除”

一、指令速查 JSON.CLEAR <key> [path]参数说明keyRedis 键名pathJSONPath&#xff08;可选&#xff0c;缺省 $ 根&#xff1b;支持 *、.. 多路径&#xff09;返回值&#xff1a;整数——被清空的数组 / 对象数量 被置零的数值字段数量。已为空或为 0 的字段不会重复统计…

Java单元测试JUnit

文章目录前言一、JUnit描述&#xff08;引入Maven&#xff09;二、基本API注解2.1、Assert类2.2、JUnit注解三、普通单元测试3.1、BeforeClass、AfterClass、Before、After、Test合集测试四、SpringBoot单元测试4.1、SpringBoot集成Junit介绍4.2、实战&#xff1a;SpringBoot项…

HR数字化转型:3大痛点解决方案与效率突破指南

在人力资源部门工作多年&#xff0c;每天面对堆积如山的简历、此起彼伏的员工咨询、错综复杂的薪酬报表……作为HR的你&#xff0c;是否常感到被海量事务性工作淹没&#xff0c;难以喘息&#xff1f;在数字化转型的浪潮下&#xff0c;传统工作方式正遭遇前所未有的挑战。本文将…

如何运用个人IP影响力寻找使命的力量|创客匠人

在知识付费领域&#xff0c;那些能穿越周期的 IP&#xff0c;往往不只是 “卖课机器”&#xff0c;而是以使命为内核的价值传递者。使命为知识变现注入灵魂&#xff0c;让知识产品从 “信息交易” 升华为 “价值共鸣”&#xff0c;这正是个人 IP 实现深度变现与长期影响力的关键…

软件开发中的瀑布式开发与敏捷开发

一、瀑布式开发&#xff08;Waterfall Model&#xff09;核心流程 采用线性、阶段化开发&#xff0c;依次经历需求分析、设计、开发、测试、部署、维护&#xff0c;前一阶段完成后进入下一阶段&#xff0c;如瀑布流水单向推进。 典型阶段&#xff1a;需求固化→架构设计→代码实…

如何卸载SQLServer

1.打开控制面板2.双击&#xff0c;弹出对话框&#xff0c;点击删除3.然后一步一步跟着提示&#xff0c;下一步下一步就好了。4.如果发现没有卸载干净&#xff0c;快捷键winR&#xff0c;输入regedit&#xff0c;进入注册表5.找到计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\…

策略设计模式分析

策略设计模式概述策略模式&#xff08;Strategy Pattern&#xff09;属于行为型设计模式&#xff0c;允许在运行时动态选择算法或行为。它将算法封装成独立的类&#xff0c;使得它们可以相互替换&#xff0c;而不会影响客户端代码。核心组件1. 策略接口&#xff08;Strategy In…

IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790

IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790

Docker环境搭建与容器操作全攻略:从入门到实战

一、环境搭建 1.1 基础包安装&#xff08;最小化系统&#xff09; # 备份Yum源配置 mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ 配置Yum源示例 可以更换为阿里云镜像 cat <<EOF > /etc/yum.repos.d/local.repo [baseos] …

4.2TCP/IP

1、TCP/IP基础&#xff08;重要&#xff09;概要网络协议3要素&#xff1a;语法、语义、时序 osi七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层tcp四层模型&#xff1a;应用层&#xff08;应用层、表示层、会话层&#xff09;、传输层、int…

Java之Stream其二

文章目录5,Optional5.1,概述5.2,使用5.2.1,创建对象5.2.2,安全消费值5.2.3,获取值5.2.4,安全获取值5.2.5,过滤5.2.6,判断5.2.7,数据转换6,方法引用6.1 推荐用法6.2 基本格式6.3 语法详解(了解)6.3.1 引用类的静态方法6.3.2 引用对象的实例方法6.3.3 引用类的实例方法6.3.4 构造…

一般芯片电气特性中Flash参数达到其最大值的条件是什么?

芯片电气特性中标注的最大值&#xff08;比如 Data Flash 擦除时间的最大值&#xff09;&#xff0c;代表在最恶劣但仍在规格书定义的工作条件范围内的情况下&#xff0c;该参数可能达到的最差值。达到这个最大值通常是由多个最坏情况因素组合造成的。 对于 Data Flash 擦除时间…

python中正则中的split方法、sub方法、finditer方法、compile方法、match对象

正则常见方法梳理 split方法 将一个字符串按照正则表达式匹配结果进行分割,返回结果是列表类型。 pattern:正则表达式的字符串或原生字符串表示string:待匹配字符串maxsplit:最大分割数,剩余部分最为最后一个元素输出flags:正则表达式使用时候的控制标记 re模块的spli…

Pytorch中张量的索引和切片使用详解和代码示例

PyTorch 中张量索引与切片详解 使用前先导入&#xff1a; import torch1.基础索引&#xff08;类似 Python / NumPy&#xff09; 适用于低维张量&#xff1a;x[i]、x[i, j] x torch.tensor([[10, 11, 12],[13, 14, 15],[16, 17, 18]])print(x[0]) # 第0行: tensor([10…

北京-4年功能测试2年空窗-报培训班学测开-第五十一天

行叭&#xff0c;今天复习第一天&#xff0c;状态效率&#xff0c;差我发现&#xff0c;一旦换了新环境/知识&#xff0c;我就需要重新调整状态&#xff0c;少则一两天&#xff0c;多则一周多。从周日起就很迷茫&#xff0c;哪怕昨天老师讲了简历与面试&#xff0c;我也清楚地知…

虚拟现实的镜廊:当技术成为存在之茧

傍晚&#xff0c;摘下VR头盔的瞬间&#xff0c;房间里未关的台灯竟显得刺眼。指尖划过光滑的塑料外壳&#xff0c;温热的机体还在微微震动&#xff0c;如同某种活物的呼吸。窗外城市的光污染在玻璃上晕染成片&#xff0c;而我的视网膜里仍残留着方才的极光&#xff1a;挪威峡湾…