python-docx 将文档根据标题二拆分为多个docx文件
时隔好久,又开始搞文档了
感觉搞来搞去还不如手动复制粘贴得了……
- 只是文本内容–>简单
- 文本内容自定义样式保持不变 (有点难度)
- 提取文档中的图片、表格 (简单)
- 按照顺序还原图片、表格到文档中,并且不改变样式(累了,毁灭吧)
- 题注、交叉引用、自动编号……(手动操作一下吧……)
写出来还是蛮有成就感的嘿嘿🤭
其实还有一些细节问题,比如段落的对齐方式、行距、缩进之类的,但是目前就做到这吧~
def split_docx_by_heading(doc_path, output_dir, heading_style='Heading 2'):
original_doc = Document(doc_path) # 加载原始文档
os.makedirs(output_dir, exist_ok=True) # 创建输出目录(如果不存在)
namespace = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'} # 获取Word文档中的命名空间
composer = None
part_doc = None
processed_footnotes, footnote_ids = caption_ids_and_texts(original_doc)
# 遍历文档中的段落和表格
for element in original_doc.element.body:
if element.tag.endswith('p'): # 判断是否为段落
p = next((p for p in original_doc.paragraphs if p._element is element), None)
# 检查段落样式是否为指定的标题样式
if p.style.name == heading_style:
# 如果当前已有文档片段,则保存该片段
if composer and part_doc:
composer.save(os.path.join(output_dir, f'{file_name}.docx'))
print(f"创建文档: {file_name}.docx")
# 使用标题二的文本作为文件名
file_name = p.text.strip()
# 创建新文档,并保持原始文档样式
part_doc = Document(doc_path)
composer = Composer(part_doc)
# 清除文档内容以开始新的章节
part_doc._body.clear_content()
# 添加标题二段落到新文档
part_doc.add_paragraph(p.text, style=p.style)
elif composer and part_doc:
if p.style.name=='Heading 1':
continue
else:
new_paragraph = part_doc.add_paragraph(p.text, style=p.style)
# 复制图像和其他图形
if p._element.findall(".//w:drawing", namespace):
new_paragraph.style = p.style.name
for run in p.runs:
if run._element.findall(".//w:drawing", namespace):
new_paragraph._p.append(deepcopy(run._element))
elif element.tag.endswith('tbl'): # 判断是否为表格
if composer and part_doc:
tbl = element
tbl_copy = deepcopy(tbl)
part_doc.add_paragraph().add_run().element.append(tbl_copy)
# 保存最后一个文档片段
if composer and part_doc:
composer.save(os.path.join(output_dir, f'{file_name}.docx'))
# 原文档路径
doc_path = './原始文档.docx'
# 拆分结果输出位置
output_dir = './split_docs/'
# 执行拆分
# 默认按照标题2拆分
# heading_style = 'Heading 2'
split_docx_by_heading(doc_path, output_dir)
奥……导包忘记了……emmmmm就这样吧(●’◡’●)
☞收藏点赞评论加关注!!感谢(●’◡’●)🙇🙇🙇