随着团队协作日益普及,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 天的临时许可证。