Python学习笔记: 批次设定word docx档增加页首及页尾(含设定中文字体)

本文同步发表于小弟自架网站(非钓鱼也无广告,纯分享):

微确幸资讯站

研究了好几天,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」。

目标资料夹档案如下:
http://img2.58codes.com/2024/20122335eACEOVbXgC.jpg

附件1-1_Word示範文件_直.docx的页首:
http://img2.58codes.com/2024/20122335IqsFzM34ZN.jpg

附件1-1_Word示範文件_直.docx的页尾:
http://img2.58codes.com/2024/20122335uaM4RjpcWH.jpg

附件2-1_Word示範文件_横.docx的页首:
http://img2.58codes.com/2024/20122335hsCYIHYyy0.jpg

附件2-1_Word示範文件_横.docx的页尾:
http://img2.58codes.com/2024/20122335IsHqhPw811.jpg

示範程式码如下:

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档加入附件之页首页尾:已完成')

程式执行结果:
http://img2.58codes.com/2024/20122335illh7lA3qs.jpg

程式处理完的资料夹:
http://img2.58codes.com/2024/20122335NTlT5A0VwA.jpg

程式处理完的档案:
附件1-1_Word示範文件_直_edited.docx的页首:
http://img2.58codes.com/2024/201223359dTNx6Vfcm.jpg

附件1-1_Word示範文件_直_edited.docx的页尾:
http://img2.58codes.com/2024/20122335EWP3fSgG9y.jpg

附件2-1_Word示範文件_横_edited.docx的页首:
http://img2.58codes.com/2024/201223356m0sWxlu1J.jpg

附件2-1_Word示範文件_横_edited.docx的页尾:
http://img2.58codes.com/2024/20122335ihRFhuJuw6.jpg

中间有一段mark掉的程式码是先判断文件是A4直式还是A4横式,
再将页首的附件1-1放在左边,也放在右边,处理的结果会是如此:

如果要使用,先将mytext = header给mark掉。
这一段h_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT也要mark掉
http://img2.58codes.com/2024/20122335gfrbN8ezYt.jpg

http://img2.58codes.com/2024/20122335uxe998WkNJ.jpg

以上就是这次的分享!!


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章