目标:截取word中的一部分内容生成一个新的文件,并且给这个文件一个新的页眉和页脚。
解决python处理word文档时的第一个问题,如何截取。首先word和pdf是不一样的,pdf是按页划分的,word的内容不是按页划分的,同一个文件word和wps打开就可能出现不同的页码(其实也有代码可以实现,好像要判断是否超出页的范围)。
在截取word时,使用python库的python-docx,截取paragraphs(段落)和allTables(表格),首先找到段落的起始位置,删除这部分以外的内容与,表格也是如此,不再展示。部分代码如下图。
for aPara in paragraphs:
p1 = aPara._element #删除代码片段
if aPara.text == '': #字符串=''
a = paragraphs.index(aPara) #a的位置
if paragraphs.index(aPara) > a: #大于a
p1.getparent().remove(p1) #删除代码片段
值得注意的是,可以利用迭代器找到aPara(段落)后的第一个表格,方便找到表格。这个表格和EXCELL的表格也不太一样,EXCELL的表格是一个表格,word内视觉上的一个表格可以是多个表格合起来的(按行拆分表格的既视感),输出表格内容的时候容易出现out of range,这里面有坑......欢迎大家来填坑。部分代码如下图。
for aPara in paragraphs:
if aPara.text == '':
ele = aPara._p.getnext() # .迭代器next下一个数据
while (ele.tag != '' and ele.tag[-3:] != 'tbl'):
# 当ele.tag== ''或者ele.tag[-3:] == 'tbl'就会输出,while()本身是一个循环
ele = ele.getnext()
if ele.tag != '':
for aTable in allTables:
if aTable._tbl == ele:
......
致此实现的word文件截取部分内容,这部分内容另存为一个word文件不再展示。
解决python处理word文档时的第二个问题,如何给新文件一个新的页眉页脚。python-docx是一个非常全面的库,一般来说word文件处理找它就完事了,要求输出文件的页眉带横线,python-docx库中没有这个东西,很折磨,很折磨......一个库解决不了的事情就再加一个库win32com。注意这里所说明的页眉带横线不是页眉文字或图片带下划线,要求如下图。
首先还是先用python-docx设置一下页眉页脚格式,毕竟它全面。部分代码如下图。
footer = document.sections[-1].footer
document.sections[-1].footer_distance = docx.shared.Cm(2.1) # 修改页脚到底端的距离
header = document.sections[-1].header
document.sections[-1].header_distance = docx.shared.Cm(0.9) # 修改页脚到底端的距离
document.sections[-1].different_first_page_header_footer = False # 去除首页不同
接下来从页眉页脚模板.docx模板文件中复制粘贴替换输出文件的页眉页脚。当然模板并非绝对,这里页脚替换了部分内容,部分代码如下图。
# ==========================================================
w = win32com.client.Dispatch('Word.Application')
w.Visible = 0 # 后台运行,不显示
w.DisplayAlerts = 0 # 后台运行,不警告
doc1 = w.Documents.Open(template) # 打开新的文件
w.ActiveDocument.Sections[0].Headers[0].Range.Copy()
wc = win32com.client.constants
doc1.Close()
# ==========================================================
w.Visible = 0 # 后台运行,不显示
w.DisplayAlerts = 0 # 后台运行,不警告
doc2 = w.Documents.Open(n3)
w.ActiveDocument.Sections[0].Headers[0].Range.Paste()
doc2.Close()
# ==========================================================
w.Visible = 0 # 后台运行,不显示
w.DisplayAlerts = 0 # 后台运行,不警告
doc3 = w.Documents.Open(template)
w.ActiveDocument.Sections[0].Footers[0].Range.Copy()
doc3.Close()
# ==========================================================
w.Visible = 0 # 后台运行,不显示
w.DisplayAlerts = 0 # 后台运行,不警告
doc4 = w.Documents.Open(n3)
w.ActiveDocument.Sections[0].Footers[0].Range.Paste()
w.ActiveDocument.Sections[0].Footers[0].Range.Find.ClearFormatting()
w.ActiveDocument.Sections[0].Footers[0].Range.Find.Replacement.ClearFormatting()
w.ActiveDocument.Sections[0].Footers[0].Range.Find.Execute('页脚替换前的文字', False, False,True,False, False, False, 1, False, '页脚替换后的文字', 2)
w.ActiveDocument.SaveAs(n3)
doc4.Close()
大体的一个思路就是这样的。