如何用Python拒绝Word(.doc/.docx)文档修订并保留批注?
解决方案:精准过滤修订类型,保留.doc格式文档的批注
这个问题我之前处理过,.doc格式的旧文档确实存在特殊情况:当「跟踪更改」开启时添加的批注,会被Word归类为wdRevisionAnnotation类型的修订记录。直接调用RejectAll()或者逐个拒绝所有修订,会连这类批注一起删除。我们需要做的是只拒绝非批注类型的修订,具体实现如下:
完整代码实现
import win32com.client as win32 # 定义Word修订类型常量(对应WdRevisionType枚举) wdRevisionAnnotation = 4 # 关联批注的修订,需要保留 wdRevisionInsert = 1 # 插入内容的修订,需拒绝 wdRevisionDelete = 2 # 删除内容的修订,需拒绝 wdRevisionFormat = 3 # 格式修改的修订,需拒绝 def reject_changes_keep_comments(file_path): # 初始化Word应用,后台运行不显示窗口 word_app = win32.gencache.EnsureDispatch('Word.Application') word_app.Visible = False try: # 打开目标文档 doc = word_app.Documents.Open(file_path) # 先关闭跟踪修订,避免后续操作产生新修订 doc.TrackRevisions = False # 倒序遍历所有修订(拒绝修订会改变集合索引,倒序更安全) revisions = doc.Revisions for idx in range(revisions.Count, 0, -1): current_rev = revisions.Item(idx) # 只拒绝非批注类型的修订 if current_rev.Type != wdRevisionAnnotation: current_rev.Reject() # 保存修改并关闭文档 doc.Save() print(f"✅ 处理完成:{file_path}") except Exception as e: print(f"❌ 处理失败:{file_path},错误信息:{str(e)}") finally: doc.Close() word_app.Quit() # 调用示例 reject_changes_keep_comments("你的文档路径.doc")
关键要点说明
- 修订类型过滤:通过判断
current_rev.Type是否为wdRevisionAnnotation,确保只拒绝内容修改、格式修改等常规修订,保留所有批注关联的修订记录(也就是保留批注本身)。 - 倒序遍历修订:拒绝修订会改变
Revisions集合的索引顺序,如果从前往后遍历会跳过部分修订,倒序遍历能避免这个问题。 - 兼容.doc和.docx:这个逻辑对两种格式都适用,不需要单独区分文档类型,批量处理20多个文档完全没问题。
注意事项
- 处理前请务必备份原文档,避免意外情况导致数据丢失;
- 确保你的电脑已安装Microsoft Word,win32com需要依赖Word的COM组件;
- 如果文档有打开密码,需要在
Documents.Open()方法中添加Password="你的密码"参数。
内容的提问来源于stack exchange,提问作者anshu




