【办公自动化】用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(
)  #根据换行符将文本拆成list
                    l2 = []
                    for l in l1:
                        l = l.split( )  #再根据空格拆成二维list,因为数据字段之间是用空格分开的,属于分列操作
                        l2.append(l)
                    # 得到的table是嵌套list类型,转化成DataFrame更加方便查看和分析
                    df = pd.DataFrame(l2)   
                    break
                else:
                    continue
        rr =  []
        for row in df.itertuples():
            rr.append(row[1])
        k=0
        for r in rr:
            if 分地区 in r:
                df2 = df.drop(list(range(k)))
                k=k+1
                df3 = pd.concat([df2,df3])
                break
            else:
                k=k+1     
    return df3

def parse_pdf2(files):
    Clist = []  #解析后的内容往这个空列表里面存
    for file in os.listdir(file_dir):
        file_path = str(file_dir)+str(file)
        print(file_path)
        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:
                        tables = pages.extract_tables()
                        Clist.append([file])
                        for table in tables:
                            for row in table:
                                row = [x.strip() for x in row if x!= and x!=None]
                                print(row)
                                Clist.append(row)
                                
    df = pd.DataFrame(Clist)
    return df

 
if __name__ == __main__:

    #年报存放路径
    file_dir = D:/2020年报/
    files = file_name(file_dir)[-1]
    #data = parsePDF(files)
    data = parse_pdf2(files)
    data.to_excel(D:/test1.xlsx,index=False)

效果

pdfplumber使用总结

1、 extract_tables() 方法适用于可编辑的pdf文档,如图片转的pdf或者扫描pdf不好使,得用OCR工具。

2、通过关键词定位需要先将pdf→text,然后查找关键词。效率比较低。

经验分享 程序员 微信小程序 职场和发展