pymupdf官方文档:https://pymupdf.readthedocs.io/en/latest/textpage.html#TextPage.extractDICT
代码:
# 证书 留学背景 工作时间
import base64
import json
import os
import re
import xlwt
base_211 = ['北京理工大学', '北京航空航天大学', '北京化工大学', '北京邮电大学', '对外经济贸易大学', '中国传媒大学', '中央民族大学', '中国矿业大学',
'中央财经大学', '中国政法大学', '中国石油大学', '中央音乐学院', '北京体育大学', '北京外国语大学', '北京交通大学', '北京科技大学',
'北京林业大学', '中国农业大学', '北京中医药大学', '华北电力大学', '北京师范大学', '中国地质大学', '清华大学', '北京大学', '中国人民大学',
'北京工业大学', '复旦大学', '华东师范大学', '上海外国语大学', '上海大学', '同济大学', '华东理工大学', '东华大学', '上海财经大学'
, '上海交通大学', '南开大学', '天津大学', '天津医科大学', '河北工业大学', '重庆大学', '西南大学', '华北电力大学', '太原理工大学', '内蒙古大学', '大连理工大学', '东北大学',
'辽宁大学',
'大连海事大学', '吉林大学',
'东北师范大学', '延边大学', '东北农业大学', '东北林业大学', '哈尔滨工业大学', '哈尔滨工程大学', '南京大学', '东南大学', '苏州大学',
'河海大学', '中国药科大学', '中国矿业大学(徐州)', '南京师范大学', '南京理工大学', '南京航空航天大学', '江南大学',
'南京农业大学浙江大学安徽大学', '合肥工业大学', '中国科学技术大学厦门大学', '福州大学南昌大学山东大学', '中国海洋大学',
'中国石油大学(华东)', '郑州大学', '武汉大学', '华中科技大学', '中国地质大学(武汉)', '华中师范大学', '华中农业大学',
'中南财经政法大学', '武汉理工大学', '湖南大学', '中南大学', '湖南师范大学', '中山大学', '暨南大学', '华南理工大学', '华南师范大学',
'广西大学', '四川大学', '西南交通大学', '电子科技大学', '西南财经大学', '四川农业大学', '云南大学', '贵州大学', '西北大学',
'西安交通大学', '西北工业大学', '陕西师范大学', '西北农林科大',
'西安电子科技大学',
'长安大学',
'兰州大学', '新疆大学',
'石河子大学', '海南大学', '宁夏大学', '青海大学', '西藏大学', '第二军医大学',
'第四军医大学', '国防科学技术大学', ]
base_985 = ['清华大学', '北京大学', '厦门大学', '中国科学技术大学', '南京大学', '复旦大学', '天津大学', '哈尔滨工业大学', '浙江大学', '南开大学', '西安交通大学', '华中科技大学',
'东南大学', '武汉大学', '上海交通大学', '中国海洋大学', '山东大学', '湖南大学', '中国人民大学', '北京理工大学', '吉林大学', '重庆大学', '电子科技大学', '大连理工大学',
'四川大学', '中山大学', '华南理工大学', '北京航空航天大学', '兰州大学', '东北大学', '西北工业大学', '北京师范大学', '同济大学', '中南大学', '中国农业大学',
'国防科技大学', '西北农林科技大学', '华东师范大学']
import fitz
def pdf_img(path):
doc = fitz.open(path)
# pdf中图片的正则表达式
checkXO = r"/Type(?= */XObject)"
checkIM = r"/Subtype(?= */Image)"
# 21是找出的固定的某个图片的pdf位置id
text = doc._getXrefString(21)
isXObject = re.search(checkXO, text)
# 使用正则表达式查看是否是图片
isImage = re.search(checkIM, text)
# 如果不是对象也不是图片,不做处理
if not isXObject or not isImage:
pass
else:
# 根据位置索引生成图像
pix = fitz.Pixmap(doc, 21)
# 根据pdf的路径生成图片的名称
save_path = path.replace('.pdf','.png')
# 如果pix.n<5,可以直接存为PNG
if pix.n < 5:
pix.writePNG(save_path)
# 否则先转换CMYK
else:
pix0 = fitz.Pixmap(fitz.csRGB, pix)
pix0.writePNG(save_path)
pix0 = None
# 释放资源
pix = None
def pdf_text(path):
doc = fitz.open(path)
# print(doc)
lenXREF = doc._getXrefLength()
req_text = []
for page in doc:
blocks = page.getText('dict').get("blocks")
# print(len(blocks))
for i in blocks:
if i.get('type') == 0:
lines = i.get("lines")
if len(lines) == 1:
spans = lines[0].get('spans')
if len(spans) == 1:
req_text.append(spans[0].get("text"))
else:
for j in lines:
spans = j.get('spans')
if len(spans) == 1:
req_text.append(spans[0].get('text'))
else:
for k in spans:
req_text.append(k.get("text"))
# print(req_text)
jianli_ID = []
ry = []
shulian = []
jt = []
gs = []
xw = []
gztime = []
xm = []
jy = []
zs = []
by = []
ld = []
for i in range(0, len(req_text) - 1):
if req_text[i] == "学\u3000校:":
xx = req_text[i + 1]
if xx in base_211 and xx in base_985:
by.append("毕业于: %s 985和211院校 " % xx)
elif xx in base_211:
by.append("毕业于: %s 211院校" % xx)
elif xx in base_985:
by.append("毕业于: %s 985院校" % xx)
else:
by.append("毕业于: %s " % xx)
elif req_text[i] == "证书":
zs.append("证书:%s %s" % (req_text[i + 1], req_text[i + 2]))
elif req_text[i] == "公\u3000司:":
gs.append("公司:%s" % req_text[i + 1])
elif req_text[i] == "学位:":
xw.append("学位: %s" % req_text[i + 1])
elif req_text[i] == "工作经验":
gztime.append("最近一段工作时间: %s %s" % (req_text[i + 1], req_text[i + 2]))
elif req_text[i] == "熟练":
shulian.append("熟练: %s" % req_text[i - 1])
elif req_text[i] == "精通":
jt.append("精通:%s" % req_text[i - 1])
elif req_text[i] == "教育经历":
jy.append("教育经历:%s %s" % (req_text[i + 1], req_text[i + 2]))
elif req_text[i] == "项目经验":
xm.append("项目经验:%s %s %s" % (req_text[i + 1], req_text[i + 2], req_text[i + 3]))
elif req_text[i] == "校内荣誉":
ry.append("校内荣誉:%s %s%s%s%s%s " % (
req_text[i + 1], req_text[i + 2], req_text[i + 3], req_text[i + 4], req_text[i + 5], req_text[i + 6]))
elif req_text[i] == "ID":
jianli_ID.append("简历ID: %s" % req_text[i + 2])
ld.append(jianli_ID[0])
ld.extend(by)
ld.extend(xw)
ld.extend(jy)
if len(zs) >= 1:
ld.extend(zs)
else:
ld.append([])
if len(ry) >= 1:
ld.extend(ry)
else:
ld.append([])
ld.extend(gs)
ld.extend(xm)
ld.extend(shulian[:3])
ld.extend(jt)
return ld
# pdf_text('D:/51job/_2020-09-21_141211/806152512.pdf')
def data_write(write_path, datas):
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True) # 创建sheet
# 将数据写入第 i 行,第 j 列
i = 0
for data in datas:
for j in range(len(data)):
sheet1.write(i, j, data[j])
j += 1
i += 1
f.save(write_path) # 保存文件
def main(file_dir, write_path):
filenames = []
datas = []
for root, dirs, files in os.walk(file_dir):
for file in files:
if file.split('.')[-1] in ['pdf']:
filenames.append(file)
for filename in filenames:
datas.append(pdf_text(file_dir + filename))
pdf_img(file_dir+filename)
data_write(write_path, datas)
if __name__ == '__main__':
file_dir = "D:\\51job\\python_2020-09-22_095655\\"
write_path = file_dir + "jx.xlsx"
main(file_dir, write_path)