使用ubuntu22.04,anaconda
由于装环境装了一阵子,不确定装了哪些包了
可能的环境安装
bash
conda install -c conda-forge pymupdf
conda install -c conda-forge camelot-py
conda install pandas
#或者
pip install PyMuPDF
pip install camelot-py[all]
pip install pandas
camelot-py 的安装可能需要其他依赖项,如 Tkinter 和 Ghostscript。在大多数情况下,它们应该在大多数 Linux 发行版和 macOS 中预安装。
bash
# Tkinter
sudo apt-get install python3-tk # Debian/Ubuntu
sudo yum install python3-tkinter # CentOS/RHEL
# Ghostscript
sudo apt-get install ghostscript # Debian/Ubuntu
sudo yum install ghostscript # CentOS/RHEL
实现代码
python
import fitz # PyMuPDF
import camelot
import pandas as pd
# 路径到您的 PDF 文件
file_path = 'path_to_file.pdf'
# 打开 PDF 文件
doc = fitz.open(file_path)
# 存储包含表格的页面编号
table_pages = []
# 检查每个页面以确定是否包含表格
for page_num in range(len(doc)):
print(f"Page {page_num} is finding.\n")
page = doc.load_page(page_num)
text = page.get_text("text")
if "表格中关键文本" in text and "表格中关键文本" in text and "表格中关键文本" in text: # 替换为检测表格的逻辑
table_pages.append(page_num + 1) # 页面编号是从 1 开始的
doc.close()
# 提取表格数据
all_tables = []
first_table = True # 用于跟踪是否是第一个表格
for page_num in table_pages:
print(f"Table {page_num} is getting.\nTotal table number is {len(table_pages)}.\n")
# 提取指定页面的表格
tables = camelot.read_pdf(file_path, pages=str(page_num), flavor='lattice') # flavour='stream'为空白划分表格方式,flavor='lattice'为线条划分表格方式。
for table in tables: # 这里是针对重复的表格头设计的,舍弃了重复的表格头
# 如果是第一个表格,保留标题
if first_table:
all_tables.append(table.df)
first_table = False
else:
# 如果不是第一个表格,跳过标题行
all_tables.append(table.df[1:])
# 是否提取到表格
if all_tables: # 提取到表格
# 合并所有提取的表格
final_table = pd.concat(all_tables, ignore_index=True)
# 导出到 CSV
final_table.to_csv('path_to_file.csv', index=False)
print("表格数据已提取并保存到 'path_to_file.csv'")
else: # 未提取到表格
print("没有提取到任何表格数据")