写报告时,经常会在word中插入几十张甚至是上百张图片,而为了美观,通常会为这些图片添加边框,但一个个添加显然是疯狂且愚蠢的,我们应该做一些更有效率的事情。
使用python-docx来实现我们的操作(由于各种原因,不会选择用宏)
首先观察一下图片加边框前后的文档结构变化(用解压缩工具打开docx文档,打开word/document.xml
文件)
对比一下添加边框前后的变化,可以看到添加边框之后,在文件结构上是多出了这么一段
<a:ln><a:solidFill><a:srgbClr val="0000ff"/></a:solidFill>
</a:ln>
所以我们只需要为图片添加这么一段属性就可以了,这个属性在pic:spPr
下面,找图片则只需要找pic:pic
即可,因此可以得到这段脚本
def addBorder(input_path, output_path, border_color):doc = Document(input_path)# 遍历文档中的所有段落for paragraph in doc.paragraphs:# 检查段落中是否有图片for run in paragraph.runs:if run.element.xpath(".//pic:pic"):# 获取图片元素pic = run.element.xpath(".//pic:pic")[0]# 获取图片的形状属性(spPr)spPr = pic.xpath(".//pic:spPr")[0]# 创建边框样式ln = OxmlElement("a:ln")# 设置边框颜色solidFill = OxmlElement("a:solidFill")srgbClr = OxmlElement("a:srgbClr")srgbClr.set("val", border_color) # RGB颜色值(颜色的16进制代码,如红色FF0000)solidFill.append(srgbClr)ln.append(solidFill)# 将边框添加到形状属性中if spPr.find(qn("a:ln")) is not None:# 如果已经存在边框,则替换spPr.remove(spPr.find(qn("a:ln")))spPr.append(ln)# 保存修改后的文档doc.save(output_path)
比如这样的一个文档
在进行批量添加边框的处理后addBorder(r"test.docx",r"test_加边框.docx","FF55CC")
(尽量使用绝对路径,否则可能会出问题)就能得到成品