随着团队协作日益普及,Word 文档中的修订追踪功能成为了版本控制和内容审阅的基石。但对于追求自动化与效率的开发者而言,如何灵活地从 Word 文档中抽取这些修订信息,仍是一大挑战。本文将向您介绍如何使用 Spire.Doc for Python 获取 Word 文档中的修订信息。
安装 Spire.Doc for Python
本教程需要 Spire.Doc for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.Doc
如果您不确定如何安装,请参考此教程:如何在 Windows 中安装 Spire.Doc for Python
Python 获取 Word 修订信息
Spire.Doc for Python 提供 IsInsertRevision 以及 DeleteRevision 属性支持判断 Word 文档中的元素是否为插入修订/删除修订。以下是详细步骤:
- 创建 Document 类的对象并加载包含修订的 Word 文档。
- 初始化列表来收集插入和删除修订信息。
- 遍历文档的章节及其正文元素。
- 获取正文中的段落,并使用 IsInsertRevision 属性判断段落是否为插入修订。
- 获取插入修订的类型,作者及其关联的文本。
- 使用 IsDeleteRevision 属性判断段落是否为删除修订,并获取其修订的类型,作者及其关联的文本。
- 遍历段落下的子元素,同样地判断 TextRange 是否为插入或删除修订,获取修订的类型,作者及其关联的文本。
- 定义 WriteAllText 函数将插入和删除修订信息保存到 TXT 文档。
- Python
from spire.doc import *
# 将文本写入文件
def WriteAllText(fname: str, text: str):
with open(fname, "w", encoding='utf-8') as fp:
fp.write(text)
inputFile = "修订测试.docx"
outputFile1 = "新增修订.txt"
outputFile2 = "删除修订.txt"
# 创建Document类的对象
document = Document()
# 加载Word文档
document.LoadFromFile(inputFile)
# 初始化列表来收集文本片段
insert_revisions = []
delete_revisions = []
# 遍历文档所有章节
for k in range(document.Sections.Count):
sec = document.Sections.get_Item(k)
# 遍历章节中的正文元素
for m in range(sec.Body.ChildObjects.Count):
# Check if the item is a Paragraph
docItem = sec.Body.ChildObjects.get_Item(m)
if isinstance(docItem, Paragraph):
para = docItem
# 判断段落是否为插入修订
if para.IsInsertRevision:
# 获取修订的类型,作者及其关联的内容
insRevison = para.InsertRevision
insType = insRevison.Type
insAuthor = insRevison.Author
insert_revisions.append(f"Revision Type: {insType.name}\n")
insert_revisions.append(f"Revision Author: {insAuthor}\n")
insert_revisions.append(f"Insertion Text: {para.Text}\n")
# 判断段落是否为删除修订
elif para.IsDeleteRevision:
# 获取修订的类型,作者及其关联的内容
delRevison = para.DeleteRevision
delType = delRevison.Type
delAuthor = delRevison.Author
delete_revisions.append(f"Revision Type:: {delType.name}\n")
delete_revisions.append(f"Revision Author: {delAuthor}\n")
delete_revisions.append(f"Deletion Text: {para.Text}\n")
# 如果段落没有修订,则遍历段落中的元素
else:
for j in range(para.ChildObjects.Count):
obj = para.ChildObjects.get_Item(j)
if isinstance(obj, TextRange):
textRange = obj
# 判断textrange是否为插入修订
if textRange.IsInsertRevision:
# 获取修订的类型,作者及其关联的内容
insRevison = textRange.InsertRevision
insType = insRevison.Type
insAuthor = insRevison.Author
insert_revisions.append(f"Revision Type: {insType.name}\n")
insert_revisions.append(f"Revision Author: {insAuthor}\n")
insert_revisions.append(f"Insertion Text: {textRange.Text}\n")
# 判断textrange是否为删除修订
elif textRange.IsDeleteRevision:
# 获取修订的类型,作者及其关联的内容
delRevison = textRange.DeleteRevision
delType = delRevison.Type
delAuthor = delRevison.Author
delete_revisions.append(f"Revision Type: {delType.name}\n")
delete_revisions.append(f"Revision Author: {delAuthor}\n")
delete_revisions.append(f"Deletion Text: {textRange.Text}\n")
# 写出修订信息到文件
WriteAllText(outputFile1, ''.join(insert_revisions))
WriteAllText(outputFile2, ''.join(delete_revisions))
# 释放资源
document.Dispose()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。