Python实现对比Word文档差异的三种方式小结
作者:nuclear2011
在日常工作中,Word 文档是合同、报告、研究论文、法律文件以及商业协议的标准格式。这些文件往往需要多人协作和多轮修订,如果仅依靠人工逐一检查,不仅耗时,还容易遗漏关键修改。
这时,Word 文档对比功能就显得尤为重要。无论是律师要核对合同版本,项目经理要确认提案修改,还是开发者需要自动化文档版本差异检查,通过编程方式都可以快速实现文档对比,确保文档准确性,节省审阅时间,并有效降低错误率。
这篇文章将探讨如何使用 Python 实现对比 Word 文档差异,主要内容包括:
- 使用 Python 实现 Word 文档对比
- 使用 Python 实现 Word 文档对比时忽略格式差异
- 使用 Python 提取 Word 文档修订并保存为文本文件
为什么要对比 Word 文档
在合同、报告或学术文档等场景中,文档对比具有以下价值:
- 法律准确性 —— 捕捉合同或协议中的细微修改,避免法律风险。
- 协作管理 —— 保障多人协作修改的透明度,便于审阅和审批。
- 版本追踪 —— 快速识别不同版本的差异,提升版本管理效率。
- 质量控制 —— 防止未经授权或误操作的更改影响最终成果。
简而言之,文档差异比较 是自动化审查和合规管控的重要工具。
环境准备
在 Python 中进行 Word 文档对比,可以使用 Spire.Doc for Python。它提供Word文档差异比较功能、灵活的对比选项,并能直接提取修订信息,适合构建自动化文档审查流程。
安装命令:
pip install spire.doc
说明:其他库(如 python-docx)虽然常用于 Word 文档处理,但并未提供原生的文档对比或修订跟踪功能。如果使用纯文本或 HTML 转换进行差异对比,将丢失段落、表格等结构化信息。
使用Python实现 Word 文档对比
最常见的应用场景是对比两个 Word 文档:一个是原始版本,另一个是修订版本(例如客户修改过的合同)。通过自动对比,可以快速标记新增、删除或修改的内容,而无需人工逐行比对。
下面的示例展示如何对比 原始.docx 与 修订.docx 两个文件,并生成一个带修订标记的对比结果:
from spire.doc import *
# 加载原始文档
original = Document()
original.LoadFromFile("原始.docx")
# 加载修订文档
revised = Document()
revised.LoadFromFile("修订.docx")
# 执行对比
original.Compare(revised, "Reviewer")
# 保存对比结果(包含修订标记)
original.SaveToFile("对比结果.docx", FileFormat.Docx2013)生成的结果文件在 Microsoft Word 中打开后,会显示与内置“比较”功能类似的红蓝修订标记,用户可以选择接受或拒绝修改。
使用Python实现Word文档对比时忽略格式差异
在实际使用中,如果只因字体、颜色或行距变化而出现大量“格式修改”提示,会严重干扰真正的内容差异。
通过 CompareOptions 类,我们可以设置忽略格式差异,只关注文本修改,让对比结果更加清晰直观。
from spire.doc import *
original = Document()
original.LoadFromFile("原始.docx")
revised = Document()
revised.LoadFromFile("修订.docx")
# 设置对比选项
options = CompareOptions()
options.IgnoreFormatting = True # 忽略字体、颜色和样式变化
# 执行对比
original.Compare(revised, "Reviewer", DateTime.get_Now(), options)
# 保存结果
original.SaveToFile("忽略格式差异.docx", FileFormat.Docx2013)
使用Python提取Word文档修订并保存为文本文件
有些情况下,除了在 Word 中查看对比结果,你还需要得到一份可编程处理的变更日志。这在以下场景尤其有用:
- 自动向团队成员发送修改摘要邮件;
- 将变更内容存入数据库,用于审计追踪;
- 集成到 Web 后台系统,展示不同版本的差异。
下面的示例展示如何提取修改类型(插入、删除、格式更改)、作者和文本内容,并保存为纯文本文件:
from spire.doc import *
def save_text(fname: str, content: str):
"""将字符串内容保存到文本文件"""
with open(fname, "w", encoding="utf-8") as fp:
fp.write(content)
def format_revision(index: int, revision, content: str) -> str:
"""格式化修订信息,包含序号、类型、作者和修订内容"""
return (
f"序号: {index}\n"
f"修订类型: {revision.Type.name}\n"
f"作者: {revision.Author}\n"
f"修订内容: {content}\n"
)
# 输入的对比结果文档
input_file = "文档比对结果.docx"
# 输出文件:插入修订
output_insert = "插入修订.txt"
# 输出文件:删除修订
output_delete = "删除修订.txt"
# 创建 Document 对象并加载 Word 文件
document = Document()
document.LoadFromFile(input_file)
# 用于收集插入和删除修订结果
insert_revisions = ["【插入修订列表】"]
delete_revisions = ["【删除修订列表】"]
# 插入和删除修订的计数器
index_insert = 0
index_delete = 0
# 遍历文档中的所有节
for k in range(document.Sections.Count):
sec = document.Sections.get_Item(k)
# 遍历节中的所有子对象
for m in range(sec.Body.ChildObjects.Count):
doc_item = sec.Body.ChildObjects.get_Item(m)
# 判断对象是否为段落
if isinstance(doc_item, Paragraph):
para = doc_item
# 段落级别的插入修订
if para.IsInsertRevision:
index_insert += 1
insert_revisions.append(format_revision(index_insert, para.InsertRevision, para.Text))
# 段落级别的删除修订
elif para.IsDeleteRevision:
index_delete += 1
delete_revisions.append(format_revision(index_delete, para.DeleteRevision, para.Text))
# 遍历段落中的所有子对象
for j in range(para.ChildObjects.Count):
obj = para.ChildObjects.get_Item(j)
# 判断对象是否为文本范围
if isinstance(obj, TextRange):
text_range = obj
# 文本级别的插入修订
if text_range.IsInsertRevision:
index_insert += 1
insert_revisions.append(format_revision(index_insert, text_range.InsertRevision, text_range.Text))
# 文本级别的删除修订
elif text_range.IsDeleteRevision:
index_delete += 1
delete_revisions.append(format_revision(index_delete, text_range.DeleteRevision, text_range.Text))
# 将结果保存到文本文件
save_text(output_insert, "\n".join(insert_revisions))
save_text(output_delete, "\n".join(delete_revisions))
总结
Python Word 文档对比 是文档管理流程中确保准确性、合规性和协作效率的关键环节。通过 Python 和 Spire.Doc for Python,你可以:
- 快速对比两个 Word 文档,并生成带修订标记的结果文件;
- 忽略格式差异,聚焦真正的内容修改;
- 提取对比结果,生成机器可读的变更日志,实现自动化集成。
将这些方法融入 Python 应用后,可以轻松实现合同审查、版本差异跟踪与自动化文档审查,既提高效率,又降低遗漏修改的风险。
到此这篇关于Python实现对比Word文档差异的三种方式小结的文章就介绍到这了,更多相关Python对比Word内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
