python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python提取复杂表格数据

Python利用Camelot和Tabula轻松提取复杂表格数据

作者:无心水

这篇文章主要为大家详细介绍了Python如何利用Camelot和Tabula实现轻松提取复杂表格数据功能,文中的示例代码讲解详细,并总结了常见问题处理方法和最佳实践,有需要的可以了解下

还在对着PDF里的表格一个一个手动敲数据?一文搞定批量自动化提取!

前言

大家好,我是你们的编程老司机。今天来聊一个让无数数据分析师、财务人员、学术研究者头疼的问题——PDF中的表格怎么批量提取出来

相信不少小伙伴都遇到过这样的场景:老板扔给你一份上百页的PDF报告,里面密密麻麻全是表格,要求你整理成Excel。你要是手动复制粘贴,轻则加班到凌晨,重则眼睛瞎掉。更惨的是,PDF里的表格经常带着各种奇葩样式:有的边框时有时无,有的跨了N页,还有的根本就是扫描件。

别慌!今天这篇文章就来彻底解决这个痛点。我会手把手教你使用CamelotTabula这两个神器,轻松搞定复杂表格的批量提取。

一、Camelot vs pdfplumber:适用场景差异对比

在开始之前,我们先来搞清楚一个问题:市面上有这么多PDF表格提取工具,为什么要选Camelot和Tabula?它们和另一个流行的库pdfplumber有什么区别?

很多同学刚开始接触PDF提取时,第一反应就是去搜pdfplumber。pdfplumber确实是个轻量级的好工具,但它的强项其实是文字和文本布局的解析,对于表格提取,尤其是复杂表格,就有些力不从心了。有用户在实际测试中发现,pdfplumber主要适用于晶格表,在遇到流式表格时表现不佳。

下面这个对比表,能帮你快速理清思路:

维度CamelotpdfplumberTabula
表格解析能力⭐⭐⭐⭐⭐ 专业级,双引擎⭐⭐⭐ 适合简单表格⭐⭐⭐⭐ 自动检测优秀
复杂表格支持合并单元格、跨页、多级表头支持有限合并单元格需手动调整
扫描件支持需配合OCR不直接支持不支持
批量处理原生支持,可多进程需自行实现网页版/脚本均可
输出格式CSV/Excel/JSON/HTMLCSV/ExcelCSV/TSV/JSON
学习曲线中等,参数较多平缓,易于上手极低,网页版零代码
依赖项Ghostscript + OpenCV仅PythonJava 8+
适用场景复杂报表、财务报表、多页表格文本解析为主,简单表格快速提取、批量处理

一句话总结:做表格提取,Camelot是专业选手;如果只是顺带处理一下表格,pdfplumber也够用。

二、环境准备:安装Camelot+Ghostscript依赖

工具再好,也得先装上才行。这一节我们搞定Camelot的安装,Ghostscript是重中之重,很多同学踩坑就是因为它没装好。

2.1 安装Ghostscript

Camelot的Lattice模式依赖Ghostscript来做PDF到图像的转换,不装会报错。

Windows系统

  1. 访问Ghostscript官网下载页面
  2. 选择AGPL版本,下载Windows 64位安装程序
  3. 双击安装,记住安装路径(例如:C:\Program Files\gs\gs10.04.0\bin
  4. 将安装路径添加到系统环境变量Path中

macOS系统

brew install ghostscript

Ubuntu/Debian系统

sudo apt-get install ghostscript

验证安装:在终端中输入gs --version,能正常输出版本号就OK了。

2.2 安装Camelot

pip install camelot-py[cv]

这里[cv]扩展会安装OpenCV等依赖,是Lattice解析模式所必需的。如果是刚接触Python的新手,建议使用虚拟环境:

python -m venv camelot_env
source camelot_env/bin/activate  # Windows用 camelot_env\Scripts\activate
pip install camelot-py[cv]

2.3 验证安装

打开Python交互环境,输入以下代码:

import camelot
print(camelot.__version__)

能正常输出版本号且没有报错,说明安装成功。

2.4 报错处理

如果遇到ModuleNotFoundError: No module named 'cv2',单独安装opencv:

pip install opencv-python

如果遇到Ghostscript相关的RuntimeError,检查Ghostscript是否正确安装并配置了环境变量。

2.5 Tabula环境准备

Tabula需要Java环境,所以先确保你的电脑上安装了Java 8或以上版本。然后通过pip安装tabula-py:

pip install tabula-py

如果需要更快处理速度,可以安装带jpype支持的版本:

pip install tabula-py[jpype]

三、Camelot核心模式:流式(Stream)/晶格(Lattice)识别

Camelot之所以强大,核心在于它提供了四种解析模式,分别适用于不同类型的表格。其中最常用的是Lattice和Stream,另外还有Network和Hybrid模式。

3.1 Lattice模式——有边框表格的首选

Lattice模式通过图像处理技术检测PDF中的线条和网格结构来重建表格,非常适合那些有清晰边框的表格。

工作原理:Lattice模式先将PDF页面转换为图像,然后使用OpenCV检测水平和垂直的线条,找到线条的交叉点,最后形成完整的表格网格。

代码示例

import camelot
# Lattice模式是默认模式,直接使用即可
tables = camelot.read_pdf('financial_report.pdf')
# 也可以显式指定flavor参数
tables = camelot.read_pdf('financial_report.pdf', flavor='lattice')
# 查看提取结果
print(f"共提取到 {len(tables)} 个表格")
print(tables[0].df)

Lattice模式的参数调优

参数作用推荐值场景
process_background处理背景线条干扰True表格有背景网格线时
line_scale线条检测灵敏度40-60边框不完整/表格倾斜时
joint_tol线条连接容差默认值线条断断续续时
resolutionPDF转图像分辨率300提高精度时

处理背景线条干扰

# 当PDF中存在背景线条可能干扰识别时
tables = camelot.read_pdf(
    'report_with_background.pdf',
    flavor='lattice',
    process_background=True  # 处理背景线条
)

处理不完整边框(短线段)

# 当表格边框不完整时,调整line_scale提高线条检测灵敏度
tables = camelot.read_pdf(
    'incomplete_border.pdf',
    flavor='lattice',
    line_scale=60
)

3.2 Stream模式——无边框表格的救星

Stream模式通过分析文本的空白间距和对齐方式来推断表格结构,不需要依赖边框线条。

工作原理:Stream模式使用PDFMiner的功能将文本字符分组,通过分析文本之间的垂直和水平间距来推断列边界和行关系。

代码示例

import camelot

# 显式使用Stream模式
tables = camelot.read_pdf(
    'no_border_table.pdf',
    flavor='stream'
)

# Stream模式默认会把整个PDF页面当做一个表格来解析,需要通过参数指定区域
tables = camelot.read_pdf(
    'no_border_table.pdf',
    flavor='stream',
    table_areas=['50,700,500,100'],  # 指定表格区域
    columns=['A', 'B', 'C']  # 手动指定列边界
)

Stream模式的参数调优

参数作用场景
table_areas指定表格区域坐标页面中有多个表格或无关内容
columns手动指定列边界位置自动列检测不准确时
edge_tol文本边缘垂直扩展容差行间距过大或过小时
row_tol文本行垂直合并容差同一行的文本被错误分到多行

3.3 Network模式和Hybrid模式

四、Tabula使用:网页版快速提取+Python API调用

如果你不需要写代码,或者只想快速提取一两个PDF表格,Tabula的网页版是你的不二之选。

4.1 Tabula网页版使用指南

Tabula是一款由记者团队开发的开源工具,完全免费且尊重隐私——所有处理都在本地完成,数据不会上传到任何服务器。

第一步:启动Tabula

访问Tabula官网下载对应系统版本,或者使用在线版本。启动后会在浏览器中打开Tabula的Web界面。

第二步:导入PDF文件

点击“Browse”按钮,选择需要提取表格的PDF文件。Tabula支持同时上传多个文件。

第三步:选择表格区域

在PDF预览界面中,用鼠标拖拽选择要提取的表格区域:

第四步:预览与导出

点击“Preview & Export Extracted Data”按钮,Tabula会实时预览提取效果。确认无误后,选择导出格式(CSV/TSV),点击“Download”保存文件。

使用技巧

4.2 Tabula Python API调用

对于批量处理需求,Tabula提供了强大的Python API——tabula-py。

基础用法

import tabula

# 读取PDF中的所有表格(默认只读取第一页)
tables = tabula.read_pdf("example.pdf")

# 读取所有页面的所有表格
tables = tabula.read_pdf("example.pdf", pages='all', multiple_tables=True)

# 读取指定页面
tables = tabula.read_pdf("example.pdf", pages='1,3,5-7')

# 读取远程PDF
tables = tabula.read_pdf("https://example.com/report.pdf")

lattice参数的使用

对于有清晰网格线的表格,设置lattice=True可以显著提高提取精度:

# 使用lattice模式(适用于有边框的表格)
tables = tabula.read_pdf(
    "structured_table.pdf",
    pages='all',
    lattice=True,
    multiple_tables=True
)

# 使用stream模式(适用于无边框表格)
tables = tabula.read_pdf(
    "text_table.pdf",
    pages='all',
    lattice=False
)

直接导出为文件

# 直接转换为CSV文件
tabula.convert_into(
    "example.pdf",
    "output.csv",
    output_format="csv",
    pages='all'
)

# 批量转换目录下所有PDF
tabula.convert_into_by_batch(
    "pdf_directory/",
    output_format='csv',
    pages='all'
)

五、批量处理:多页表格自动拼接、批量导出Excel

实际工作中,我们面对的往往不是单页单表格,而是跨越多页的复杂报表。这一节就来解决批量处理的核心痛点。

5.1 Camelot多页表格处理

Camelot原生支持多页表格提取,关键是通过pages参数指定页面范围:

import camelot

# 提取第1-10页的所有表格
tables = camelot.read_pdf(
    'large_report.pdf',
    pages='1-10',
    flavor='lattice'
)

# 提取指定页面:第1、3、5-7页
tables = camelot.read_pdf(
    'large_report.pdf',
    pages='1,3,5-7'
)

# 提取所有页面
tables = camelot.read_pdf(
    'large_report.pdf',
    pages='all'
)

5.2 跨页表格自动拼接

当一个表格跨越多页时,Camelot会将每页的表格片段分别提取出来,我们需要将它们纵向拼接成一个完整的表格:

import camelot
import pandas as pd

# 提取所有页面中的表格
tables = camelot.read_pdf('multi_page_table.pdf', pages='all', flavor='lattice')

# 方法1:检查解析质量后选择性合并
all_data = []
for i, table in enumerate(tables):
    # 获取解析报告,过滤低质量提取结果
    report = table.parsing_report
    if report['accuracy'] > 90:  # 只保留准确率高于90%的表格
        all_data.append(table.df)
        print(f"第{report['page']}页表格,准确率:{report['accuracy']}%")

# 纵向拼接所有表格
if all_data:
    merged_df = pd.concat(all_data, ignore_index=True)
    merged_df.to_excel('merged_output.xlsx', index=False)
else:
    print("未找到有效的表格数据")

处理跨页表格时的注意事项

  1. 表头重复问题:跨页表格通常每页都有表头,拼接前需要去除重复表头
  2. 列数不一致:不同页面的表格可能因提取精度问题导致列数不同,需要对齐处理
  3. 解析质量检查:建议先检查每页的accuracy值,过滤掉解析质量低的页面
# 高级版本:处理表头重复和列对齐
import camelot
import pandas as pd

def merge_multi_page_tables(pdf_path, pages, flavor='lattice'):
    """
    合并跨页表格,自动处理表头和列对齐问题
    """
    tables = camelot.read_pdf(pdf_path, pages=pages, flavor=flavor)
    
    all_data = []
    header = None
    
    for idx, table in enumerate(tables):
        df = table.df
        
        # 第一页:记录表头
        if header is None:
            header = df.iloc[0].tolist()
            all_data.append(df.iloc[1:])  # 跳过表头行
        else:
            # 后续页面:检查并去除可能的表头行
            if df.iloc[0].tolist() == header:
                all_data.append(df.iloc[1:])  # 跳过重复表头
            else:
                all_data.append(df)
    
    # 确保所有子表列数一致
    max_cols = max([df.shape[1] for df in all_data])
    for i, df in enumerate(all_data):
        if df.shape[1] < max_cols:
            for _ in range(max_cols - df.shape[1]):
                df.insert(df.shape[1], f'col_{df.shape[1]}', '')
    
    result = pd.concat(all_data, ignore_index=True)
    result.columns = header
    return result

# 使用示例
merged_df = merge_multi_page_tables(
    'financial_report.pdf',
    pages='5-15',
    flavor='lattice'
)
merged_df.to_excel('merged_financial_data.xlsx', index=False)

5.3 批量处理多个PDF文件

对于需要处理大量PDF文件的场景,可以使用循环+多进程来加速:

import camelot
import pandas as pd
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor

def process_single_pdf(pdf_path):
    """处理单个PDF文件"""
    try:
        tables = camelot.read_pdf(pdf_path, pages='all', flavor='lattice')
        if len(tables) > 0:
            # 合并所有表格
            df = pd.concat([t.df for t in tables], ignore_index=True)
            return pdf_path.stem, df
    except Exception as e:
        print(f"处理 {pdf_path} 时出错: {e}")
        return pdf_path.stem, None

def batch_process_pdfs(folder_path, output_path):
    """批量处理文件夹中的所有PDF"""
    pdf_files = list(Path(folder_path).glob('*.pdf'))
    
    # 使用多进程加速处理
    with ProcessPoolExecutor(max_workers=4) as executor:
        results = list(executor.map(process_single_pdf, pdf_files))
    
    # 将结果写入Excel的不同Sheet
    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
        for filename, df in results:
            if df is not None:
                # Sheet名称不超过31个字符
                sheet_name = filename[:31]
                df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    print(f"批量处理完成,结果保存至 {output_path}")

# 使用示例
batch_process_pdfs('./pdf_reports/', 'batch_output.xlsx')

5.4 Tabula批量提取

Tabula同样支持批量处理,而且API更简洁:

import tabula
import pandas as pd
from pathlib import Path

# 方式1:批量转换所有PDF为CSV
tabula.convert_into_by_batch(
    "pdf_directory/",
    output_format='csv',
    pages='all'
)

# 方式2:遍历处理多个PDF并合并到单个Excel
def batch_extract_tabula(pdf_folder, output_excel):
    pdf_files = list(Path(pdf_folder).glob('*.pdf'))
    all_data = {}
    
    for pdf_file in pdf_files:
        # 提取所有表格
        tables = tabula.read_pdf(
            str(pdf_file),
            pages='all',
            multiple_tables=True
        )
        
        if tables:
            # 如果单个PDF有多个表格,合并它们
            combined = pd.concat(tables, ignore_index=True)
            all_data[pdf_file.stem] = combined
    
    with pd.ExcelWriter(output_excel) as writer:
        for name, df in all_data.items():
            df.to_excel(writer, sheet_name=name[:31], index=False)

batch_extract_tabula('./pdfs/', 'tabula_batch_output.xlsx')

六、实战案例:财务报表/统计报表的完整提取流程

理论讲完了,我们来一个完整的实战案例。假设我们需要从一份上市公司的年度财务报告中提取利润表数据,这份报告共50页,其中第5-15页是利润表,跨越了10页,表格有清晰的边框,但存在合并单元格。

步骤1:PDF预览与表格特征分析

打开PDF文件,先肉眼观察表格特征:

步骤2:编写提取脚本

import camelot
import pandas as pd
import numpy as np

def extract_financial_statement(pdf_path, start_page, end_page):
    """
    提取财务报表数据
    
    参数:
        pdf_path: PDF文件路径
        start_page: 起始页
        end_page: 结束页
    """
    # 使用Lattice模式提取所有页面
    tables = camelot.read_pdf(
        pdf_path,
        pages=f'{start_page}-{end_page}',
        flavor='lattice',
        process_background=True  # 处理可能的背景线条干扰
    )
    
    print(f"共提取到 {len(tables)} 个表格片段")
    
    # 检查每个表格的解析质量
    quality_report = []
    for i, table in enumerate(tables):
        report = table.parsing_report
        quality_report.append({
            'table_index': i,
            'page': report['page'],
            'accuracy': report['accuracy'],
            'whitespace': report['whitespace']
        })
        print(f"表格 {i} - 页码:{report['page']}, 准确率:{report['accuracy']}%")
    
    # 筛选高质量表格(准确率>90%)
    high_quality_tables = [
        table for table in tables 
        if table.parsing_report['accuracy'] > 90
    ]
    
    # 拼接所有表格
    all_dfs = [table.df for table in high_quality_tables]
    
    # 处理合并单元格造成的空值
    for df in all_dfs:
        # 前向填充空值(处理合并单元格)
        df.fillna(method='ffill', axis=0, inplace=True)
    
    # 纵向拼接
    final_df = pd.concat(all_dfs, ignore_index=True)
    
    # 数据清洗:去除全为空的行和列
    final_df.dropna(how='all', axis=0, inplace=True)
    final_df.dropna(how='all', axis=1, inplace=True)
    
    # 设置第一行为列名(通常是表头)
    final_df.columns = final_df.iloc[0]
    final_df = final_df.iloc[1:].reset_index(drop=True)
    
    return final_df, quality_report

# 执行提取
pdf_path = 'annual_report_2024.pdf'
financial_data, report = extract_financial_statement(pdf_path, 5, 15)

# 保存结果
financial_data.to_excel('profit_statement.xlsx', index=False)
print(f"提取完成!共获得 {len(financial_data)} 行数据")

步骤3:数据验证与清洗

提取完成后,一定要进行数据验证:

# 数据验证与清洗
def validate_extracted_data(df, expected_columns):
    """验证提取数据的完整性和准确性"""
    
    print("=" * 50)
    print("数据验证报告")
    print("=" * 50)
    
    # 1. 检查列数是否与预期一致
    print(f"实际列数: {len(df.columns)}")
    print(f"预期列数: {len(expected_columns)}")
    
    # 2. 检查关键数据列是否存在
    for col in expected_columns:
        if col in df.columns:
            print(f"✓ 列 '{col}' 存在")
        else:
            print(f"✗ 列 '{col}' 缺失")
    
    # 3. 检查数值列的数据类型
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    print(f"数值列: {len(numeric_cols)} 列")
    
    # 4. 检查空值比例
    null_ratio = df.isnull().sum() / len(df) * 100
    for col, ratio in null_ratio.items():
        if ratio > 10:
            print(f"⚠ 列 '{col}' 空值比例过高: {ratio:.1f}%")
    
    # 5. 数据预览
    print("\n数据预览:")
    print(df.head(10))
    
    return df

expected_columns = ['项目', '2024年度', '2023年度', '增减幅度(%)']
validate_extracted_data(financial_data, expected_columns)

步骤4:处理OCR场景(扫描件PDF)

如果遇到的是扫描件PDF,需要先进行OCR处理:

from pdf2image import convert_from_path
import pytesseract
import camelot

def extract_with_ocr(pdf_path, pages):
    """
    处理扫描件PDF:先OCR识别,再提取表格
    """
    # 将PDF页面转换为图像
    images = convert_from_path(pdf_path, dpi=300, first_page=pages[0], last_page=pages[-1])
    
    # 保存为临时PDF文件
    temp_pdf_path = 'temp_ocr_output.pdf'
    images[0].save(temp_pdf_path, save_all=True, append_images=images[1:])
    
    # 对OCR后的PDF进行表格提取
    tables = camelot.read_pdf(temp_pdf_path, pages='all', flavor='lattice')
    
    return tables

七、避坑:表格边框缺失、倾斜的处理技巧

在实际工作中,我们经常遇到各种“不完美”的PDF表格。这一节总结一些常见问题的解决方案。

7.1 边框缺失表格的处理

当表格边框不完整或完全缺失时,Lattice模式可能会失败。解决方案:

方案一:切换Stream模式

# 无边框表格,尝试Stream模式
tables = camelot.read_pdf(
    'no_border_table.pdf',
    flavor='stream',
    table_areas=['50,700,550,150'],  # 指定表格区域
    columns=['A', 'B', 'C', 'D']  # 手动指定列边界
)

方案二:手动指定列边界

对于Stream模式提取不准确的情况,可以通过分析文本位置来手动指定列边界:

# 先获取文本位置信息,确定列边界
from camelot.utils import get_page_layout

layout = get_page_layout('no_border_table.pdf', pages='1')
print(layout)  # 查看文本块的x坐标,推断列边界位置

# 根据分析结果设置列边界
tables = camelot.read_pdf(
    'no_border_table.pdf',
    flavor='stream',
    columns=['100', '250', '400', '550']  # 列边界的x坐标
)

7.2 表格倾斜的处理

当PDF中的表格有旋转角度时,直接提取会导致数据错乱:

# 对于倾斜表格,使用Lattice模式并调整line_scale参数
tables = camelot.read_pdf(
    'rotated_table.pdf',
    flavor='lattice',
    line_scale=40  # 提高线条检测灵敏度
)

如果表格倾斜角度较大,建议先用图像处理工具矫正:

import cv2
import numpy as np
from pdf2image import convert_from_path

def deskew_table(pdf_path, page_num):
    """检测并矫正倾斜的表格"""
    images = convert_from_path(pdf_path, first_page=page_num, last_page=page_num)
    img = np.array(images[0])
    
    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 检测边缘
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    
    # 霍夫变换检测直线
    lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
    
    if lines is not None:
        # 计算倾斜角度
        angles = []
        for rho, theta in lines[:,0]:
            angle = theta * 180 / np.pi - 90
            if abs(angle) < 45:
                angles.append(angle)
        
        if angles:
            median_angle = np.median(angles)
            # 旋转矫正
            (h, w) = img.shape[:2]
            center = (w // 2, h // 2)
            M = cv2.getRotationMatrix2D(center, median_angle, 1.0)
            rotated = cv2.warpAffine(img, M, (w, h))
            return rotated
    
    return img

7.3 背景线条干扰的处理

PDF中的背景网格线可能被误认为表格边框:

# 使用process_background参数过滤背景线条
tables = camelot.read_pdf(
    'table_with_background.pdf',
    flavor='lattice',
    process_background=True  # 区分前景和背景线条
)

7.4 合并单元格的处理

合并单元格在提取后通常会表现为空值,需要进行后处理填充:

def handle_merged_cells(df):
    """
    处理合并单元格造成的空值问题
    """
    # 纵向填充(处理行合并)
    df.fillna(method='ffill', axis=0, inplace=True)
    
    # 横向填充(处理列合并)
    df.fillna(method='ffill', axis=1, inplace=True)
    
    return df

# 使用示例
df_cleaned = handle_merged_cells(extracted_df)

7.5 常见错误对照表

错误现象可能原因解决方案
RuntimeError: Please make sure that Ghostscript is installedGhostscript未安装或路径错误安装Ghostscript并配置环境变量
提取结果为空页面/表格区域参数错误检查pages/table_areas参数
表格数据错位选择了错误的解析模式根据表格特征选择lattice或stream
准确率(accuracy)很低表格结构复杂或边框不清晰调整line_scale或尝试stream模式
空白率(whitespace)过高表格被错误分割调整edge_tol或table_areas参数
合并单元格数据丢失后处理不足使用fillna进行空值填充

7.6 调试技巧:可视化检测

Camelot提供了强大的可视化调试功能,帮助你理解提取过程:

import camelot

# 提取表格
tables = camelot.read_pdf('problematic_table.pdf', flavor='lattice')

# 可视化检测到的表格网格
tables[0].plot(kind='grid')
# 可视化检测到的文本
tables[0].plot(kind='text')
# 可视化表格轮廓
tables[0].plot(kind='contour')

# 保存可视化图像
import matplotlib.pyplot as plt
plt.savefig('debug_grid.png')

通过可视化输出,你可以直观地看到Camelot是如何“理解”表格结构的,从而更有针对性地调整参数。

八、总结与推荐

8.1 工具选择建议

场景推荐工具理由
有边框的标准表格Camelot (Lattice)提取精度最高,自动检测
无边框但排列整齐的表格Camelot (Stream)基于文本间距推断结构
快速临时提取(少量文件)Tabula网页版零代码,操作简单
批量处理大量PDFTabula Python APIAPI简洁,批量处理方便
跨页复杂报表Camelot + Pandas灵活控制拼接和清洗逻辑
扫描件PDFCamelot + OCR预处理配合pdf2image+pytesseract
需要同时提取文字+表格pdfplumber功能更全面,但表格精度略低

8.2 最佳实践清单

8.3 延伸阅读

如果你对PDF处理有更深层次的兴趣,可以进一步了解:

到此这篇关于Python利用Camelot和Tabula轻松提取复杂表格数据的文章就介绍到这了,更多相关Python提取复杂表格数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文