"""
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)
标签:账单,缴费,python,df,pd,pdf,PDF,data,读取
From: https://www.cnblogs.com/HeroZhang/p/17835472.html