最近改文章,期刊要求提供所有修改内容都标红的修订稿,本着能不手改就不手改的原则,我尝试检索了一下自动修改的方法,最先找到的是简书上的一篇使用VB宏命令批量修改的文章 (Word-接受全部修订为标红字体),但是尝试之后发现运行时间很长,且有些修订不会生效,然后就开始了我的漫长研究之路。
研究过程
因为最熟悉Python,首先想到的是Python操作Word文档,主要尝试了一下三个模块,但是最后都失败了。
python-docx模块
该模块是目前Python操作Word文档最主流的模块,然而查阅资料后发现该模块目前尚不支持操作修订,只能尝试通过xml获取修订文本,通过Find选择对应本文并修改颜色。由于太过复杂,放弃。
aspose-words模块
Google到了该模块操作Word修订的sample,尝试使用后该模块确实能够实现该功能。奈何这是一个付费模块,保存的文档有水印,且只能保存9页。去水印和全文档保存则需要付费或30天试用,无奈放弃。
win32com模块
该方式也就是通过.Net提供的com文件,直接调用Word原生的API处理文档。参考多方资料后,能勉强实现修订标红功能,代码如下:
# 引入模块 import win32com.client as win32 import win32com from tqdm import tqdm # 设置参数 path_file_input = r"input.doc" path_file_output = r"output.doc" # 创建word应用并打开文档 word=win32com.client.DispatchEx("Word.Application") word=win32.gencache.EnsureDispatch("Word.Application") word.Visible = False word.DisplayAlerts = False doc = word.Documents.Open(path_file_input) # 激活文档并关闭修订功能 doc.Activate() word.ActiveDocument.TrackRevisions = False num_true=0 # 用于计算成功修改的修订数目 try: # 迭代所有的修订 for i in tqdm(range(word.ActiveDocument.Revisions.Count)): # word.ActiveDocument.Revisions.Count 获取修订的数量 # 尝试修改当前修订 try: # 获取当前修订 revision=word.ActiveDocument.Revisions.Item(i) # 设置修订字体颜色 revision.Range.Font.Color=255 # 接受修订 revision.Accept() num_true+=1 # 捕获异常。该模块在使用 word.ActiveDocument.Revisions.Item(i) 获取某一修订时,如果这一修订时删除的修订,就会抛出 集合所要求的成员不存在 错误,因此需要进行异常捕获 except Exception as e: pass # 另存修改后的文档 doc.SaveAs(path_file_output) except Exception as e: print(e) # 保证文档和应用句柄释放 finally: # # 关闭 word 文档 doc.Close() # # 关闭 office word.Quit() del doc,word # 打印成功处理的修订数量 print('num_true',num_true)
然而,实践发现,以上代码在处理到有图篇插入和分节符插入等相关的修订时,后面的所有修订都不会再处理。如果要使用该代码,需要首先在文档中手动将这些部分接受修订,使得该代码实用性不高,放弃……
最终成果
尝试了一圈Python效果都不好,最后幡然醒悟,微软的文档还是得用微软自己的东西,再次把VBA捡起来。参考VBA帮助文档中对修订的操作,最后成品代码如下:
Sub Set_Revisions_Red() '关闭修订模式 ActiveDocument.TrackRevisions = Flase '迭代每一个修订,改为红色并接受修订 For n = 1 To ActiveDocument.Revisions.Count '移动至下一个修订 Selection.NextRevision (True) '设置修订内容字体颜色为红色 Selection.Font.Color = wdColorRed '接受当前修订 Selection.Range.Revisions.AcceptAll Next n End Sub
该代码能够实现包括doc和docx在内的Word文档修改内容标红并接受修订功能。使用方式为:
- 打开Word文档
- 按
Alt+F11
打开VBA界面。 - 在左侧窗格中选中Normal后,点击
菜单栏-插入-模块
,在弹出的窗口中粘贴上述代码。
- 按
F5
运行代码。 - 稍等片刻,等待程序运行完成即可。本人在 Word 2019上测试无任何问题,包括文本修改、图片插入、表格插入、域代码更新等均能识别,果然不愧是微软亲儿子……
至此,打完收工。
本文参考
- Word-接受全部修订为标红字体
- How to extract text inserted with track-changes in python-docx
- Track Changes in a Document
- Python 使用 win32com 模块对 word 文件进行操作
- Python - Using win32com.client to accept all changes in Word Documents
- How can I output Word documents/plaintext with all accepted/rejected track changes?
- Selecting and deleting a Line Present in a Word Document Using Python / Win32
- Revisions object (Word)