如何用Python合并多个docx文件?附文本文件合并代码示例
合并DOCX文件的Python实现方案
一、替代with open的DOCX合并代码
用python-docx处理DOCX文件时,不需要with open语法,而是通过docx.Document类加载和保存文档。对应你原来的文本合并逻辑,改写后的代码如下:
from docx import Document # 初始化空的目标文档 combined_doc = Document() files_to_combine = ["file1.docx", "file2.docx", "file3.docx"] # 你的待合并文件列表 for doc_path in files_to_combine: # 加载源文档 source_doc = Document(doc_path) # 复制源文档的所有段落到目标文档,同时保留格式 for para in source_doc.paragraphs: new_para = combined_doc.add_paragraph() for run in para.runs: new_run = new_para.add_run(run.text) # 复制文本格式(字体、粗细、斜体等) new_run.font.bold = run.font.bold new_run.font.italic = run.font.italic new_run.font.size = run.font.size new_run.font.name = run.font.name # 每个文档之间添加空行分隔(对应原代码中的换行操作) combined_doc.add_paragraph() # 保存合并后的文档 combined_doc.save("Combined_file.docx")
这个逻辑和你原来的文本合并完全对应:遍历待合并列表,逐个加载文件,将内容复制到目标文档,最终保存结果。
二、关于DOCX文件中的图片复制
python-docx本身不支持直接复制图片(因为图片存储在DOCX的压缩包内部,需要同时处理媒体文件的复制和文档内的引用关系)。基础的段落复制代码会丢失图片,要实现带图片的合并,需要额外处理图片的提取和插入:
简化版的带图片合并代码示例:
from docx import Document import os import shutil from docx.shared import Inches def extract_images(doc_path, temp_dir): # 解压DOCX文件提取内部图片 os.makedirs(temp_dir, exist_ok=True) shutil.unpack_archive(doc_path, temp_dir, "zip") media_dir = os.path.join(temp_dir, "word/media") images = [] if os.path.exists(media_dir): for img_file in os.listdir(media_dir): images.append(os.path.join(media_dir, img_file)) return images # 初始化目标文档 combined_doc = Document() temp_root = "temp_docx_media" files_to_combine = ["file1.docx", "file2.docx"] for doc_path in files_to_combine: source_doc = Document(doc_path) temp_dir = os.path.join(temp_root, os.path.basename(doc_path).split(".")[0]) # 提取当前文档的图片 images = extract_images(doc_path, temp_dir) # 遍历源文档的所有内容元素 for element in source_doc.element.body: if element.tag.endswith("p"): para = source_doc.paragraphs[source_doc.element.body.index(element)] new_para = combined_doc.add_paragraph() for run in para.runs: # 检测是否为图片run if run._element.xml.find("pic:pic") != -1: # 匹配对应图片并插入 img_idx = int(run._element.xml.split("media/image")[-1].split(".")[0]) - 1 if img_idx < len(images): combined_doc.add_picture(images[img_idx], width=Inches(4)) else: # 复制文本内容和格式 new_run = new_para.add_run(run.text) new_run.font.bold = run.font.bold new_run.font.italic = run.font.italic new_run.font.size = run.font.size new_run.font.name = run.font.name elif element.tag.endswith("tbl"): # 处理表格(如需保留表格内容) tbl = source_doc.tables[source_doc.element.body.index(element)] new_tbl = combined_doc.add_table(tbl.rows.count, tbl.columns.count) for i, row in enumerate(tbl.rows): for j, cell in enumerate(row.cells): new_tbl.cell(i,j).text = cell.text combined_doc.add_paragraph() # 保存合并后的文档 combined_doc.save("Combined_with_images.docx") # 清理临时文件 shutil.rmtree(temp_root)
注意:这个简化版仅处理基础图片场景,复杂的图文混排(如图片与文本同段落)需要更细致的XML解析优化。
内容的提问来源于stack exchange,提问作者ewr3243
相关产品推荐
相关产品推荐

