在 Word 文档的日常处理中,插入图片是一项高频操作。无论是生成产品说明书、制作报告封面,还是在合同模板中嵌入公司 Logo,图片都是传达信息的重要载体。然而,当需要批量生成包含图片的文档时,手动操作不仅效率低下,还容易出现尺寸不一致、位置偏移等问题。通过 Python 编程方式向 Word 文档中插入图片,可以精确控制图片的大小、位置、文字环绕方式等属性,实现文档的自动化生成。本文将介绍如何使用 Python 在 Word 文档中插入图片,并涵盖位置控制、文字环绕、批量添加和透明色设置等常用操作。
环境准备
本文使用 Spire.Doc for Python 库来操作 Word 文档。该库提供了 AppendPicture() 和 DocPicture 等接口,支持在段落级别和文档级别插入图片,并允许对图片的尺寸、位置、环绕样式进行精细配置。通过以下命令安装:
bash
pip install Spire.Doc
安装完成后,在脚本中导入所需模块即可开始使用。
基本图片插入
在 Word 文档中插入图片最直接的方式是调用段落的 AppendPicture() 方法。该方法接收一个图片文件路径,会在段落末尾追加一个图片对象,并返回该对象的引用,以便后续对图片属性进行设置。这种方式适合在新建文档中按顺序追加图文内容。
python
from spire.doc import *
from spire.doc.common import *
outputFile = "/InsertImage.docx"
# 创建文档并添加节
document = Document()
section = document.AddSection()
# 添加段落并插入图片
paragraph = section.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Left
picture = paragraph.AppendPicture("Logo1.png")
# 设置图片大小
picture.Width = 80
picture.Height = 50
# 添加说明文字
paragraph = section.AddParagraph()
paragraph.Format.LineSpacing = 20
tr = paragraph.AppendText("以上为插入的示例图片。")
tr.CharacterFormat.FontName = "宋体"
tr.CharacterFormat.FontSize = 14
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

上述代码通过 Document() 创建一个空白文档,调用 AddSection() 添加节后,在节中新增段落并调用 AppendPicture() 插入图片。返回的 picture 对象支持 Width 和 Height 属性,单位为磅。如果不设置这两个属性,图片将以原始尺寸显示,可能导致图片过大而影响排版,因此在实际使用中建议根据文档版式统一指定尺寸。
使用 DocPicture 控制位置与环绕
AppendPicture() 方法虽然简单,但图片会跟随段落流式排列,无法精确控制其在页面中的绝对位置。当需要将图片放置在页面的指定坐标,或设置文字环绕效果时,应使用 DocPicture 对象。DocPicture 是 Spire.Doc 中表示文档图片的核心类,支持设置 HorizontalPosition、VerticalPosition 以及 TextWrappingStyle 等高级属性。
python
from spire.doc import *
from spire.doc.common import *
inputFile = "/示例文档.docx"
outputFile = "/InsertImageWithPosition.docx"
# 加载文档
doc = Document()
doc.LoadFromFile(inputFile)
# 获取一个节
section = doc.Sections[0]
# 创建图片对象并加载图片文件
picture = DocPicture(doc)
picture.LoadImage("/Logo1.png")
# 设置纵向与横向的定位基准为"页面"
picture.VerticalOrigin = VerticalOrigin.Page
picture.HorizontalOrigin = HorizontalOrigin.Page
# 设置图片在页面中的绝对位置
picture.HorizontalPosition = 100
picture.VerticalPosition = 120
# 设置图片尺寸
picture.Width = 80
picture.Height = 50
# 设置文字环绕样式
picture.TextWrappingStyle = TextWrappingStyle.Through
# 将图片插入到指定段落的起始位置
paragraph = section.AddParagraph()
paragraph.ChildObjects.Insert(0, picture)
doc.SaveToFile(outputFile, FileFormat.Docx)
doc.Close()

这段代码的关键在于通过 DocPicture(doc) 创建独立的图片对象,再调用 LoadImage() 加载图片文件。HorizontalPosition 和 VerticalPosition 分别指定图片左上角的水平和垂直坐标,单位为磅。TextWrappingStyle 属性决定文字如何围绕图片排列,Through 表示文字穿透环绕,还有 Square(四周环绕)、TopAndBottom(上下环绕)、Behind(衬于文字下方)等多种可选值。最后通过 ChildObjects.Insert() 将图片插入到段落的指定位置,实现精确的插入点控制。
在每一页添加图片
在某些场景下,如添加公司 Logo 或水印图片,需要让图片出现在文档的每一页中。由于 Word 的页面内容是动态流动的,无法直接在每一页上插入图片。解决思路是将图片放置在页眉或页脚中------页眉页脚的内容会自动在每一页重复显示。通过设置图片的 VerticalOrigin 和 HorizontalOrigin 为 Page,可以将图片相对于页面进行定位,从而突破页眉页脚的默认区域限制。
python
from spire.doc import *
from spire.doc.common import *
inputFile = "/参考文档.docx"
outputFile = "AddImageToEachPage.docx"
# 打开 Word 文档
document = Document()
document.LoadFromFile(inputFile)
imgPath = "Logo1.png"
# 在页脚中添加图片并设置位置
picture = document.Sections[0].HeadersFooters.Footer.AddParagraph().AppendPicture(imgPath)
# 将图片的原点设为页面,使图片可以在整个页面范围内定位
picture.VerticalOrigin = VerticalOrigin.Page
picture.HorizontalOrigin = HorizontalOrigin.Page
picture.VerticalAlignment = ShapeVerticalAlignment.Bottom
picture.TextWrappingStyle = TextWrappingStyle.none
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

上述代码在文档第一节(Sections[0])的页脚(Footer)中添加段落并插入图片。默认情况下,页脚中的图片只能出现在页脚区域内,但通过将 VerticalOrigin 和 HorizontalOrigin 设置为 Page,图片的坐标参考系从页脚区域切换为整个页面,此时 VerticalAlignment.Bottom 会将图片固定在页面底部。TextWrappingStyle.none 表示图片不与正文文字产生环绕关系,避免影响正文的排版布局。
设置图片的透明色
在某些设计场景中,可能需要将图片中的某种背景色设为透明,使图片与文档背景融合。Spire.Doc 提供了 TransparentColor 属性,可以将图片中指定的纯色像素变为透明。这一功能适用于处理具有单色背景的 Logo 或图标。
python
from spire.doc import *
from spire.doc.common import *
inputFile = "./Data/ImageTemplate.docx"
outputFile = "SetTransparentColor.docx"
# 加载文档
doc = Document()
doc.LoadFromFile(inputFile)
# 获取第一节的第一段
paragraph = doc.Sections[0].Paragraphs[0]
# 遍历段落中的子对象,找到图片并设置透明色
for k in range(paragraph.ChildObjects.Count):
obj = paragraph.ChildObjects.get_Item(k)
if isinstance(obj, DocPicture):
picture = obj
picture.TransparentColor = Color.get_Blue()
doc.SaveToFile(outputFile, FileFormat.Docx)
doc.Close()
这段代码遍历段落中的所有子对象,通过 isinstance(obj, DocPicture) 判断是否为图片类型。找到图片后,将 TransparentColor 设置为蓝色(Color.get_Blue()),图片中所有与该颜色匹配的像素将变为透明。需要注意,透明色匹配是基于精确颜色值的,如果图片中的背景色与目标颜色存在细微色差,可能无法完全去除,建议在图片制作阶段尽量使用纯色背景。
实用技巧
调整已有图片的尺寸
对于已存在图片的文档,可以通过遍历段落的 ChildObjects 集合来定位图片并重置其尺寸,这在批量统一文档中图片大小的场景中非常实用。
python
from spire.doc import *
from spire.doc.common import *
inputFile = "./Data/ImageTemplate.docx"
outputFile = "ResetImageSize.docx"
doc = Document()
doc.LoadFromFile(inputFile)
section = doc.Sections[0]
paragraph = section.Paragraphs[0]
# 重置段落中第一张图片的尺寸
for i in range(paragraph.ChildObjects.Count):
docObj = paragraph.ChildObjects.get_Item(i)
if isinstance(docObj, DocPicture):
picture = DocPicture(docObj)
picture.Width = 50
picture.Height = 50
break
doc.SaveToFile(outputFile, FileFormat.Docx)
doc.Close()
上述代码通过 DocPicture(docObj) 将已有的文档对象转换为图片对象,再设置 Width 和 Height 属性。结合循环遍历所有段落,即可实现文档中全部图片的尺寸统一调整。
设置文字环绕类型
除了 TextWrappingStyle 之外,TextWrappingType 属性可以进一步控制文字环绕的具体方式。例如 TextWrappingType.Both 表示文字从图片的两侧环绕,适用于居中放置的图片。
python
for i in range(doc.Sections.Count):
sec = doc.Sections.get_Item(i)
for j in range(sec.Paragraphs.Count):
para = sec.Paragraphs.get_Item(j)
for k in range(para.ChildObjects.Count):
docObj = para.ChildObjects.get_Item(k)
if docObj.DocumentObjectType == DocumentObjectType.Picture:
picture = docObj
picture.TextWrappingStyle = TextWrappingStyle.Through
picture.TextWrappingType = TextWrappingType.Both
这段代码遍历文档中所有节、所有段落中的图片对象,统一设置环绕样式为 Through 并指定环绕类型为 Both,使文字从图片左右两侧同时环绕。
总结
本文介绍了使用 Python 在 Word 文档中精准插入与定位图片的方法。通过灵活配置图片的尺寸、文字环绕样式及透明度等属性,能够实现图文混排的全自动化,大幅提升排版效率,满足不同场景下的文档设计需求。