python 读取社保年度对账单数据

发布时间 2023-11-16 09:37:38作者: 冀未然

"""
    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就有几个元素

    # 将pages_data内的元素按“\n”拆分放入data列表
    for item in pages_data:
        data += item.split("\n")

    total_data += data
    # print(total_data)
    total_data = total_data[2:-5]
    columns = ['月缴费工资', '养老月缴费基数', '养老单位缴费', '养老个人缴费', '失业月缴费基数', '失业单位缴费', '失业个人缴费', '工伤月缴费基数', '工伤单位缴费',
               '医疗(生育)月缴费基数', '医疗(生育)单位缴费', '医疗(生育)个人缴费']
    df = pd.DataFrame()
    target = [item.split(' ') for item in total_data]
    # print(target)
    for x in target:
        df_sub = pd.DataFrame(x).T

        df = pd.concat([df, df_sub], axis=0)
        # print(df)
        # exit()
    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\社会保险记录\各年度对账单\\2022年年度对账单.pdf'
    Out_file = 'J:\规章制度\其他\HTG Locker\wx\社会保险记录\各年度对账单\\2022年年度对账单.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)