python读取pdf中的表格

发布时间 2023-11-15 16:56:21作者: 冀未然

"""
    python 读取pdf中的表格   社保信息 数据
"""
import pandas as pd
import pdfplumber
pd.set_option('display.width', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)
pd.set_option('display.float_format',  '{:,.3f}'.format)


def search(PDF_path):
    total_data = []
    data = []
    with pdfplumber.open(PDF_path) as pdf:
        pages_data = [page.extract_text() for page in pdf.pages]  # 读取PDF每页的文本,共多少页,pages_data就有几个元素
    # print(pages_data)
    # exit()
    # 将pages_data内的元素按“\n”拆分放入data列表
    for item in pages_data:
        data += item.split("\n")

    total_data += data
    # total_data = total_data[2:-5]
    columns = ['缴费起止年月', '养老缴费月数', '养老年缴费基数', '养老个人缴费', '失业年缴费月数', '失业年缴费基数', '失业个人缴费', '工伤年缴费月数', '工伤缴费基数',  '医疗年缴费月数', '医疗年缴费基数', '医疗个人缴费', '生育缴费月数', '生育年缴费基数', ]
    df = pd.DataFrame()
    target = [item.split(' ') for item in total_data][21:-12]
    for x in target:
        if len(x) < 14:
            for i in range(14 - len(x)):
                x.append('0')

        df_sub = pd.DataFrame(x).T
        df = pd.concat([df, df_sub], axis=0)
    df = df.reset_index(drop=True)
    ind = df[~df[0].str.contains('至')].index   # 找到 第 0 列 不包含 ‘至’ 的 行的 index
    df.drop(ind, inplace=True)                  # 删除 不包含 某些 索引号 的 行
    df.columns = columns
    return df


if __name__ == '__main__':
    # pdf文件地址
    PDF_file = 'J:\\规章制度\\其他\\HTG Locker\\wx\\社会保险记录\\参保人员缴费信息.pdf'
    Out_file = 'J:\\规章制度\\其他\\HTG Locker\\wx\\社会保险记录\\参保人员缴费信息.csv'
    # PDF_path = os.path.dirname(PDF_file)
    # PDF_FileName = os.path.abspath(PDF_file).split('\\')[-1]
    if PDF_file.endswith(".pdf"):
        df = search(PDF_file)
        print(df.head(100))
    else:
        print("所提供文件 非 pdf文件!")
    df.to_csv(Out_file, index=False)