用Python将 PDF 中的表格提取为 Excel/CSV

*用Python将 PDF 中的表格提取为 Excel/CSV,*支持文本型 PDF 和 扫描件/图片型 PDF(需 OCR 识别)。程序包含以下功能:

1.自动检测 PDF 类型(文本 or 扫描件)
2.提取表格数据并保存为 Excel/CSV
3.处理多页 PDF
4.命令行交互 & 图形界面(可选)

1. 安装依赖库

运行前,先安装所需库:

复制代码
pip install tabula-py pandas pytesseract pdf2image opencv-python pillow

2. 完整代码

导入相关模块

复制代码
import os
import pandas as pd
import tabula
from pdf2image import convert_from_path
import pytesseract
import cv2
import tempfile
import argparse

定义函数

复制代码
def pdf_to_excel(pdf_path, output_path, use_ocr=False):

    """
    将 PDF 中的表格转换为 Excel 文件
    :param pdf_path: PDF 文件路径
    :param output_path: 输出 Excel/CSV 路径
    :param use_ocr: 是否强制使用 OCR(针对扫描件)
    """
    try:
        # 检查输出格式
        file_ext = os.path.splitext(output_path)[1].lower()
        if file_ext not in ['.xlsx', '.csv']:
            raise ValueError("输出文件格式必须是 .xlsx 或 .csv")

        # 尝试直接提取文本表格(非扫描件)
        if not use_ocr:
            try:
                print("尝试提取文本表格...")
                dfs = tabula.read_pdf(pdf_path, pages='all', multiple_tables=True)
                if not dfs:
                    raise RuntimeError("未检测到表格,可能为扫描件图片。")
                
                # 合并所有表格页
                combined_df = pd.concat(dfs, ignore_index=True)
                
                if file_ext == '.xlsx':
                    combined_df.to_excel(output_path, index=False)
                else:
                    combined_df.to_csv(output_path, index=False)
                print(f"转换成功!结果已保存至: {output_path}")
                return
            
            except Exception as e:
                print(f"文本提取失败(可能为扫描件),尝试 OCR: {e}")
                use_ocr = True

        # OCR 处理扫描件/图片
        if use_ocr:
            print("正在使用 OCR 识别扫描件...")
            with tempfile.TemporaryDirectory() as temp_dir:
                # 将 PDF 转换为图片
                images = convert_from_path(pdf_path, output_folder=temp_dir)
                all_text = []
                
                for i, img in enumerate(images):
                    img_path = os.path.join(temp_dir, f"page_{i+1}.jpg")
                    img.save(img_path, 'JPEG')
                    
                    # 使用 OpenCV 增强图像(可选)
                    img_cv = cv2.imread(img_path)
                    gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
                    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
                    
                    # OCR 识别
                    text = pytesseract.image_to_string(thresh, config='--psm 6')
                    all_text.append(text)

                # 将识别结果保存为表格
                text_combined = "\n".join(all_text)
                lines = [line.split() for line in text_combined.split('\n') if line.strip()]
                df = pd.DataFrame(lines)
                
                if file_ext == '.xlsx':
                    df.to_excel(output_path, index=False, header=False)
                else:
                    df.to_csv(output_path, index=False, header=False)
                print(f"OCR 转换完成!结果已保存至: {output_path}")

    except Exception as e:
        print(f"转换失败: {e}")

if __name__ == "__main__":
    # 命令行参数解析
    parser = argparse.ArgumentParser(description="PDF 表格提取工具")
    parser.add_argument("pdf_path", help="输入的 PDF 文件路径")
    parser.add_argument("output_path", help="输出的 Excel/CSV 文件路径")
    parser.add_argument("--ocr", action="store_true", help="强制使用 OCR(针对扫描件)")
    args = parser.parse_args()

    # 运行转换
    pdf_to_excel(args.pdf_path, args.output_path, args.ocr)

命令行运行

复制代码
# 默认自动检测 PDF 类型
python pdf_to_excel.py input.pdf output.xlsx

# 强制使用 OCR(针对扫描件)
python pdf_to_excel.py scanned.pdf output.csv --ocr

直接调用函数

复制代码
pdf_to_excel("input.pdf", "output.xlsx", use_ocr=False)

重点说明:
文本型 PDF:使用 tabula-py 直接提取表格结构。
扫描件/图片 PDF:
通过 pdf2image 将 PDF 转为图片。
使用 OpenCV 对图像预处理(二值化、去噪)。
调用 pytesseract(Tesseract OCR)识别文字并生成表格。

扫描件质量:OCR 精度受图片清晰度影响,建议高分辨率 PDF。

复杂表格:若表格有合并单元格,可能需要手动调整输出结果。

中文支持:确保 Tesseract 安装了中文语言包(chi_sim)。

如果需要进一步优化(如自定义表格解析逻辑),可以在此基础上扩展!

相关推荐
用户0190275816117 分钟前
用 DuckDB 存查 A 股 K 线:零服务、SQL 直接分析
python
程序员果子2 小时前
本体构建方法
人工智能·python·知识图谱·agent框架·本体
天天被压力2 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
总裁余(余登武)2 小时前
【python项目】:1操作EXCEl自动化开发
python·自动化·excel
芝梵家电数据笔记2 小时前
用字段表核对暖菜板长期使用条件:结构、暖区、质保边界
python·家电·数据校验·dataclass·选购
天天被压力2 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
卷无止境15 小时前
RAGFlow 项目全景报告:从文档解析引擎到 Agent 原生数据库
后端·python
灿飞屋16 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
benchmark_cc16 小时前
单只股票五档盘口接入个人研究仓库:QuantDash 读取、校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
青少儿编程课堂18 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛