最近改文章,期刊要求提供所有修改内容都标红的修订稿,本着能不手改就不手改的原则,我尝试检索了一下自动修改的方法,最先找到的是简书上的一篇使用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文档修改内容标红并接受修订功能。使用方式为:

  1. 打开Word文档
  2. Alt+F11打开VBA界面。
  3. 在左侧窗格中选中Normal后,点击菜单栏-插入-模块,在弹出的窗口中粘贴上述代码。

  4. F5运行代码。
  5. 稍等片刻,等待程序运行完成即可。本人在 Word 2019上测试无任何问题,包括文本修改、图片插入、表格插入、域代码更新等均能识别,果然不愧是微软亲儿子……

至此,打完收工。


本文参考

  1. Word-接受全部修订为标红字体
  2. How to extract text inserted with track-changes in python-docx
  3. Track Changes in a Document
  4. Python 使用 win32com 模块对 word 文件进行操作
  5. Python - Using win32com.client to accept all changes in Word Documents
  6. How can I output Word documents/plaintext with all accepted/rejected track changes?
  7. Selecting and deleting a Line Present in a Word Document Using Python / Win32
  8. Revisions object (Word)

Word修订内容批量标红的更多相关文章

  1. iOS UILabel 使用姿势大全(标红关键字)

    一.初始化 ? 1 2 3 UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)];       ...

  2. 每日学习+AS小相册+导入图片标红的原因

    学习内容: 1.TextView(怎么设置文本). Button(怎么设置按钮事件). ImageView(怎么设置图片) 2.LinearLayout的基本使用 今日成果:做了一个小相册 遇到的问题 ...

  3. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  4. javaScript实现修改输入框之后标红

    <html> <title>实现标红</title> <script type="text/javascript">  functi ...

  5. Intellij IDEA @Override 标红

    Intellij IDEA 升级到15之后,之前那些@Override 的都标红,提示@Override is not allowed when implement interface method ...

  6. 第九篇、UITabbar增加类别用来标红点

    1.系统中只有设置bage的方式,设置为nil也是为一个红点,但是很大,并不是我们需要的 2.扩充标红点的方法 (常用于有新的动态提示标志) #import <UIKit/UIKit.h> ...

  7. python读取word表格内容(1)

    1.首页介绍下word表格内容,实例如下: 每两个表格后面是一个合并的单元格

  8. C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容

    序 在前面的文章C# 如何插入.修改.删除Word批注一文中介绍了如何操作Word批注的一些方法,在本篇文章中继续介绍操作Word批注的方法.分以下三种情况来介绍: 1. 插入图片到Word批注 2. ...

  9. OpenXml修改word特定内容

    采用OpenXml来修改word特定内容,如下: word: OpenXml修改word之前: OpenXml修改word之后: 代码: string path = @"C:\Users\A ...

随机推荐

  1. 《HALCON数字图像处理》第五章笔记

    目录 第五章 图像运算 图像的代数运算 加法运算 图像减法 图像乘法 图像除法 图像逻辑运算(位操作) 图像的几何变换 图像几何变换的一般表达式 仿射变换 投影变换 灰度插值 图像校正 我在Gitee ...

  2. LSP原则是什么

    如果这篇文章能够帮到您,请给我一个免费的赞,谢谢QWQ! LSP原则并不难,但是地方就会把它说的很啰嗦,如果你对LSP还是感到疑惑,请往下看看. 先上代码: public class Bird { p ...

  3. CSS 网页字体最佳实践

    一般在网页的字体设置中,可以将字体分类三类: 系统字体:使用系统自带的字体 兜底字体:当系统字体无法正常使用,而兜底的字体 Emoji 字体:显示网页中的表情字体 为了满足不同平台,以及 Emoji ...

  4. dubbo容错机制

    dubbo的容错机制 Failover Cluster(默认) 失败自动切换,当出现失败,重试其它服务器.通常用于读操作,但重试会带来更长延迟. Failfast Cluster 快速失败,只发起一次 ...

  5. 从零开始实现lmax-Disruptor队列(三)多线程消费者WorkerPool原理解析

    MyDisruptor V3版本介绍 在v2版本的MyDisruptor实现多消费者.消费者组间依赖功能后.按照计划,v3版本的MyDisruptor需要支持多线程消费者的功能. 由于该文属于系列博客 ...

  6. 剖析 SPI 在 Spring 中的应用

    vivo 互联网服务器团队 - Ma Jian 一.概述 SPI(Service Provider Interface),是Java内置的一种服务提供发现机制,可以用来提高框架的扩展性,主要用于框架的 ...

  7. SAP Context menu(菜单)

    *&---------------------------------------------------------------------* *& Report RSDEMO_CO ...

  8. Linux shell脚本算术运算和逻辑运算

    算术运算 默认不支持算数运算.所以需要特定的语法来完成, shell进行算数运算的工具: let declare (())或$(())或$[] bc let: 格式: let var=算术表达式 例如 ...

  9. JAVA设计模式总结—建造者模式

    建造者模式 模式动机与定义 ​ 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. ​ 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...

  10. 手把手教你用 Python 下载手机小视频

    今天为大家介绍使用 mitmproxy 这个抓包工具如何监控手机上网,并且通过抓包,把我们想要的数据下载下来. 启动 mitmproxy 首先我们通过执行命令 mitmweb 启动mitmproxy, ...