Python的一次實際應用:利用Python操作Word文檔的頁碼
需求:一次性處理24個文檔的頁碼。
文檔詳情:
1、每個word文檔包含800頁左右,每一頁包含一個標題和一張圖片。
2、由于圖片有橫排也有豎排,因此,每頁文檔都進行了分節處理。
3、但每一節的頁碼格式不統一,并且沒有連續編號。
要求:
1、所有頁面的頁碼必須連續編號。
2、所有頁面的頁碼格式必須統一(字體、字號相同)。
如果手工處理工作量很大,因為無法全部選中頁腳。使用Python語言程序來處理上述文檔,程序代碼如下:
from docx import Document
from docx.oxml.shared import qn
from docx.oxml import parse_xmldef process_word_document(doc_path, output_path):# 打開Word文檔doc = Document(doc_path)# 獲取文檔中的所有節sections = doc.sectionsprint(f"文檔共有 {len(sections)} 個節")# 處理第一節(特殊處理,不鏈接到前一節)first_section = sections[0]first_footer = first_section.footer# 清除第一節頁腳內容for paragraph in list(first_footer.paragraphs):p = paragraph._elementp.getparent().remove(p)for table in list(first_footer.tables):t = table._elementt.getparent().remove(t)print("已處理第1節")# 處理其他節for i, section in enumerate(sections[1:], 1):footer = section.footer# 清除頁腳內容for paragraph in list(footer.paragraphs):p = paragraph._elementp.getparent().remove(p)for table in list(footer.tables):t = table._elementt.getparent().remove(t)# 設置頁腳鏈接到前一節footer.is_linked_to_previous = True# 設置頁碼為續前節sectPr = section._sectPrpgNumType = sectPr.find(qn('w:pgNumType'))if pgNumType is None:pgNumType = parse_xml(r'<w:pgNumType xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>')sectPr.append(pgNumType)# 移除start屬性以確保續前節start_attr = qn('w:start')if pgNumType.get(start_attr) is not None:pgNumType.attrib.pop(start_attr, None)# 每處理100節打印一次進度if (i + 1) % 100 == 0:print(f"已處理 {i + 1} 個節")# 保存文檔doc.save(output_path)print(f"處理完成! 共處理了 {len(sections)} 個節")print("所有節的頁腳已清除,設置為鏈接到前一節,且頁碼設置為續前節")# 使用示例
if __name__ == "__main__":input_file = r"d:\wgx\ok\a619.docx" # 輸入文件路徑output_file = r"d:\wgx\ok\a6190.docx" # 輸出文件路徑process_word_document(input_file, output_file)
由于程序代碼調用了第三方庫(python-docx),因此需要先安裝python-docx
庫才能運行上述代碼。
打開windows命令行窗口,執行如下命令:
pip install python-docx
執行結果如下圖所示:
打開Python集成環境,執行上面的程序代碼。結果如下:
該程序的功能是:
1、清除所有節中頁腳的內容(包括頁碼)。
2、設置每一節【鏈接到前一節】屬性。
3、設置每一節的頁碼為【續前節】。
執行完畢后,在文檔的任意一節中手工插入頁碼,設置頁碼的格式即可。則整個文檔的頁碼格式保持一致,并且每一節連續編號。