因手头有几百个WORD文档,每个文档为针对某些企业的安全隐患检查数据,包括隐患文字信息及图片。具体格式如下:
现希望通过程序自动读取其中的图片及其文字。最后存入数据库中。考虑用python自动读取相关数据及图片。
通过python读取图片文件,统一另存到文件夹”d:/temp/“中,图片文件统一按规范格式“p_检查ID_行号_图号”生成,形如“p147_1_1.jpg”。
# 函数:get_picturelist
# 功能:提取WORD文件中的图片生成列表,结果生成列表文件,图片文件格式形如“p147_1_1.jpg”。
# 意义:p_检查ID_行号_图号,安全隐患每个检查ID为一个WORD表格,某一行中的图片不一定只有1张,可能会有2张以上的图片,所以通过行号,图片加以识别。
# 参数1:document 为文档对象。
# 参数2:paragraph 为内嵌图片的段落对象,比如第1段内
# 参数3:picpre 图片文件前前缀。
def get_picturelist(document:Document, paragraphs, picpre):
# 获取WORD中的图片列表,有可能一个段落中含有多张图片
img_list = []
for paragraph in paragraphs:
img_list += paragraph._element.xpath('.//pic:pic')
if len(img_list) == 0 or not img_list:
return []
# 将图片列表中的图片读出来另存为文件,并返回文件名列表
size = len(img_list)
re_list=[]
for i in range(0,size):
img:CT_Picture = img_list[i]
embed = img.xpath('.//a:blip/@r:embed')[0]
related_part:ImagePart = document.part.related_parts[embed]
image: Image = related_part.image
re_list.append(image)
# 保存图片文件 并返回文件名列表
result_list=[]
i = 1
for pic in re_list:
filename = "d:/temp/%s_%d.jpg" % (picpre,i)
# print("保存图片文件%s..." % filename, end='')
fw = open(filename,"wb")
fw.write(pic.blob)
fw.close()
# print("完成!")
result_list.append(filename)
i += 1
return result_list
# --------------------------------------------------
# 提取表格中的安全隐患文字信息
# 参数:
# doc -- 对应的WORD文档对象
# table ---Word文档中的表格,如表格索引从0开始,例如 doc.tables[0]为WORD文档中的第1个表格,我这里数据在第3个表格doc.tables[2]
def get_yhlist(doc,table,inspect_id):
yhlist = []
for i in range(1, len(table.rows)):
# indexno = table.cell(i, 0).text
indexno = i
hztype = table.cell(i, 1).text
picpre = "p%d_%d" % (inspect_id,i)
pic = get_picturelist(doc,table.cell(i,2).paragraphs, picpre)
hzdesc = table.cell(i, 3).text
zgjy = table.cell(i, 4).text
yhlist.append({
'indexno':indexno, # 序号
'hztype':hztype, # 危险类别
'pic': pic, # 图片文件名
'hzdesc':hzdesc, # 隐患问题描述
'zgjy':zgjy # 整改建议
})
return yhlist
# --------------------------------------------------
# 调用get_yhlist函数
for i in range(1,100):
docfile = 'file'+str(i)
doc = Document(docfile)
qyname = doc.tables[0].cell(1,1).text
print('企业名称=%s',qyname)
yhlist = get_yhlist(doc,doc.tables[2],inspect_id)
#隐患列表后续存入数据库中,在此不再展开。
为控制WORD,需要用到docx库。
from docx import Document
from docx.image.image import Image
from docx.parts.image import ImagePart
from docx.oxml.shape import CT_Picture