为word中的图片批量添加边框

写报告时,经常会在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")(尽量使用绝对路径,否则可能会出问题)就能得到成品

posted @ 2025-02-11 15:43  WXjzc  阅读(44)  评论(0)    收藏  举报