目录
- 专栏导读
- 概述
- 主要工具库介绍
- 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处理需求
环境准备
安装依赖
pip install tabula-py
pip install camelot-py[cv]
pip install pdfplumber
pip install PyMuPDF
pip install pandas
pip install openpyxl xlsxwriter
Java环境配置(tabula-py需要)
java -version
方法一:使用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).stemfor 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_file = os.path.join(output_dir, f"{base_name}.xlsx")table.to_excel(excel_file, index=False)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表格"&