You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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")

关键要点说明

  1. 修订类型过滤:通过判断current_rev.Type是否为wdRevisionAnnotation,确保只拒绝内容修改、格式修改等常规修订,保留所有批注关联的修订记录(也就是保留批注本身)。
  2. 倒序遍历修订:拒绝修订会改变Revisions集合的索引顺序,如果从前往后遍历会跳过部分修订,倒序遍历能避免这个问题。
  3. 兼容.doc和.docx:这个逻辑对两种格式都适用,不需要单独区分文档类型,批量处理20多个文档完全没问题。

注意事项

  • 处理前请务必备份原文档,避免意外情况导致数据丢失;
  • 确保你的电脑已安装Microsoft Word,win32com需要依赖Word的COM组件;
  • 如果文档有打开密码,需要在Documents.Open()方法中添加Password="你的密码"参数。

内容的提问来源于stack exchange,提问作者anshu

火山引擎 最新活动