【办公自动化】用pdfplumber读取年报pdf中的表格

该博客介绍了如何使用pdfplumber库来读取PDF文件中的表格,特别是年报中的数据。首先,遍历指定文件夹中的PDF,然后通过extract_text()方法寻找关键词‘分地区’来定位页面。接着,利用extract_tables()提取表格,并将内容转化为DataFrame。最后,将数据保存为Excel文件。pdfplumber的使用限制在于它对不可编辑的PDF支持不佳,且基于关键词搜索效率较低。

用pdfplumber读取年报pdf中的表格

思路

年报里的表格是长这样的:

在这里插入图片描述

首先循环读取指定文件夹中的年报pdf,然后用pdfplumber进行解析,再根据需要的关键词定位页码,进一步导出表格内容,将表格转化为list按行写入空列表。最后将二维列表转化为dataframe。

完整代码

import pandas as pd
import pdfplumber
import os

#获取pdf文件名
def file_name(file_dir):
    for files in os.walk(file_dir):
        return files

# 这个函数暂时没用到
def parsePDF(files):
    df3 = pd.DataFrame(columns=['A'])
    for file in files:
        file_path = file_dir+file
        with pdfplumber.open(file_path) as pdf:
            for i in range(100):
                pages = pdf.pages[i]
                tt = pages.extract_text()
                if tt is None:
                    continue
                elif '分地区' in tt:
                    l1 = tt.split('\n')  #根据换行符将文本拆成list
                    l2 = []
                    for l in l1:
                        l
<think>好的,用户的问题是关于如何使用pdfplumberPDF中提取指定区域的表格,需要示例代码。首先,我需要回忆一下pdfplumber的相关功能和文档。根据之前提供的引用内容,pdfplumber可以提取文本、形状和表格,并且能够处理页面中的元素位置信息。用户提到的引用[2]中的示例代码展示了如何提取整个页面的表格,但用户需要的是指定区域,因此需要进一步调整。 接下来,我需要确定如何指定区域。pdfplumber允许通过坐标来定义区域,通常使用页面的宽度和高度来确定位置。用户可能需要先获取页面的尺寸,然后通过设置矩形的边界来截取特定区域。引用[4]中提到可以读取文本的位置信息,这可能对确定区域坐标有帮助。 然后,考虑用户提到的引用[3],问题出现在两栏PDF中,提取时忽略分栏导致数据错乱。这说明在处理分栏文档时,需要精确指定区域以避免跨栏提取。因此,在示例代码中需要指导用户如何确定正确的坐标范围,可能需要手动调试或使用可视化工具辅助定位。 接下来,我需要构建示例代码的步骤。首先打开PDF文件,选择特定页面,然后定义区域的边界(x0, y0, x1, y1)。使用crop方法截取该区域,再调用extract_table()提取表格数据。最后,需要关闭PDF文件。同时,要提醒用户坐标系统是从左下角开始,可能需要多次调整坐标值。 还需要考虑异常处理,比如区域是否包含有效表格,以及如何处理不同的表格结构。引用[2]中的extract_table方法可能需要参数调整,比如设置垂直或水平策略来优化提取结果。 最后,生成相关问题,帮助用户进一步解决可能遇到的困难,比如确定坐标、处理复杂表格或分栏文档的问题。确保回答结构清晰,步骤明确,代码示例正确,并引用相关的资料来源。</think>### 使用pdfplumber提取PDF指定区域表格的步骤 1. **确定目标区域坐标** PDF坐标系以页面左下角为原点$(0,0)$,横向为$x$轴,纵向为$y$轴。可通过以下方法获取坐标: - 使用`page.bbox`获取页面整体边界框$(x0,y0,x1,y1)$ - 通过调试代码输出文本位置信息辅助定位[^4] 2. **截取指定区域** 使用`page.crop()`方法划定矩形范围: ```python import pdfplumber with pdfplumber.open("your_file.pdf") as pdf: page = pdf.pages[0] # 选择页码 # 定义区域坐标(需根据实际情况调整) area = (50, 100, page.width-50, 300) # (x0, y0, x1, y1) cropped_page = page.crop(area) ``` 3. **提取表格数据** 调用`extract_table()`方法: ```python table = cropped_page.extract_table({ "vertical_strategy": "lines", # 基于线条检测 "horizontal_strategy": "lines" }) print(table) ``` 4. **完整示例代码** ```python import pdfplumber def extract_table_from_area(pdf_path, page_num, bbox): with pdfplumber.open(pdf_path) as pdf: page = pdf.pages[page_num] cropped = page.crop(bbox) return cropped.extract_table() # 用法示例 table_data = extract_table_from_area( "sample.pdf", page_num=0, bbox=(80, 150, 400, 500) # 需根据实际PDF调整坐标 ) for row in table_data: print("|".join(row)) ``` ### 注意事项 - 坐标单位与PDF分辨率相关,需通过多次调试确定精确值 - 复杂表格建议结合`extract_tables()`方法[^2] - 两栏文档需分别定义左右栏区域提取[^3] - 可通过可视化工具(如Adobe Acrobat)查看元素坐标辅助定位
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值