本文同步发表于小弟自架网站(非钓鱼也无广告,纯分享):
微确幸资讯站
研究了好几天,word批次增加页首和页尾有一些先天上的限制!!
python的docx模组功能很强,但还是有部份功能力有未逮。
首先在纯word档下以docx模组读取档案后,
是无法分辨出页面内容的Soft Break!!
Soft Break就是我们在打word文件时,超过一页时,word会自动帮你把内容放到下一页。
另外有些人会以一直换行来分页,这个也是Soft Break,这种方式在程式中都无法分辨跳页。
docx模组可以分辨的是Hard Break,也就是手动的「分页符号」和「分节符号」。
所以你的word档案如果要将页数等资料放到页首和页尾的话,请果断放弃,思考其他解决方案!!
如果你不是上面的需求,再继续往下看。
假设有2个word文件,
第1个文件要在所有页面的页首和页尾加上档名「附件1-1_XXXXXX.docx」的前几个字「附件1-1」。
第2个文件要在所有页面的页首和页尾加上档名「附件2-1_XXXXXX.docx」的前几个字「附件2-1」。
目标资料夹档案如下:
附件1-1_Word示範文件_直.docx的页首:
附件1-1_Word示範文件_直.docx的页尾:
附件2-1_Word示範文件_横.docx的页首:
附件2-1_Word示範文件_横.docx的页尾:
示範程式码如下:
import osimport refrom docx import Documentfrom docx.shared import Pt, Cmfrom docx.oxml.ns import qnfrom docx.enum.text import WD_ALIGN_PARAGRAPH# 设定目标资料夹file_path = "d:\\temp\\test" # 找出所有doc档做成listfiles = [x for x in os.listdir(file_path) if x.endswith(".docx")]for file in files: # Regex第一组括号是要找出附件○-○,做为页首的文件 pattern = '(附件\d+-\d)_.+(.docx?$)' target = re.findall(pattern, file) # 找出符合Regex为pattern的档案 if target: print(file) # header为页首、页尾的文字 header = target[0][0] print(header) # 目标docx档案 docx_file = os.path.join(file_path, file) # 加入页首后之docx存档命名 edited_docx_file = os.path.join(file_path, os.path.splitext(file)[0] + "_edited" + ".docx") # 开启目标docx档案 document = Document(docx_file) # 如果文件有分节,要遍历所有的分节,如果文件没有分节,那就可以直接用document.sections[0]来处理,不需要遍历 for section in document.sections: ## 以下页首的附件文件要在页面左、右两边都加,所以要另外做判断,让文件的左右可以在正确的位置呈现附件的文字 ## --------------------------------------------------------------------------------- ## 获取页面宽度 #page_width = section.page_width ## 获取页面高度 #page_height = section.page_height ## 假设文件都是A4直式或横式,以下为判断文件是直式或横式 ## 假如页面高度大于页面宽度,那就是A4直式 #if page_height > page_width: # mytext = header + "\t"*15 + " " + header # ## 假如页面高度没有大于页面宽度,那就是A4横式 #else: # mytext = header + "\t"*23 + " " + header ## --------------------------------------------------------------------------------- mytext = header print(f'正在处理{docx_file}') print('----------------------') # 开始处理页首 # -------------------------------------------------- h_paragraph = section.header.paragraphs[0] # 设定页首格式 h_paragraph_format = h_paragraph.paragraph_format # 设定页首靠右对齐 h_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT # 设定页首置中对齐 #h_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 设定页首靠左对齐(内定为靠左对齐,所以不写是一样的效悲) #h_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT # 以下是将页首资料套用到文件 h_run = h_paragraph.add_run(mytext) # 这个是设定粗体 h_run.bold = True # 这个是设定字体大小为14 h_run.font.size = Pt(14) # 这个是设定英文数字为 Times New Roman字型 h_run.font.name = 'Times New Roman' # 这个是设定中文为微软正黑体 #h_run._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软正黑体') # 这个是设定中文为标楷体字型 h_run._element.rPr.rFonts.set(qn('w:eastAsia'), u'标楷体') # -------------------------------------------------- # 开始处理页尾 # -------------------------------------------------- f_paragraph = section.footer.paragraphs[0] # 设定页尾格式 f_paragraph_format = f_paragraph.paragraph_format # 设定页尾靠右对齐 f_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT # 设定页尾置中对齐 #f_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 设定页尾靠左对齐(内定为靠左对齐,所以不写是一样的效悲) #f_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT # 以下是将页尾资料套用到文件 f_run = f_paragraph.add_run(mytext) # 这个是设定粗体 f_run.bold = True # 这个是设定字体大小为14 f_run.font.size = Pt(14) # 这个是设定英文数字为 Times New Roman字型 f_run.font.name = 'Times New Roman' # 这个是设定中文为微软正黑体 #f_run._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软正黑体') # 这个是设定中文为标楷体字型 f_run._element.rPr.rFonts.set(qn('w:eastAsia'), u'标楷体') # -------------------------------------------------- document.save(edited_docx_file) print('所有word档加入附件之页首页尾:已完成')
程式执行结果:
程式处理完的资料夹:
程式处理完的档案:
附件1-1_Word示範文件_直_edited.docx的页首:
附件1-1_Word示範文件_直_edited.docx的页尾:
附件2-1_Word示範文件_横_edited.docx的页首:
附件2-1_Word示範文件_横_edited.docx的页尾:
中间有一段mark掉的程式码是先判断文件是A4直式还是A4横式,
再将页首的附件1-1放在左边,也放在右边,处理的结果会是如此:
如果要使用,先将mytext = header给mark掉。
这一段h_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT也要mark掉
以上就是这次的分享!!