在文档 (.docx) 的特定位置添加图像?

Add an image in a specific position in the document (.docx)?

我使用 Python-docx 生成 Microsoft Word document.The 用户在为例如 "Good Morning every body,This is my %(profile_img)s do you like it?" 写作时希望如此 在 HTML 字段中,我创建了一个 word 文档,并从数据库中恢复了用户的图片,然后用用户的图片替换了关键字 %(profile_img)s 不在文档末尾。对于 Python-docx,我们使用此指令添加图片:

document.add_picture('profile_img.png', width=Inches(1.25))

图片添加到文档中,但出现添加到文档末尾的问题。 用python不能在microsoft word文档的特定位置添加图片吗?我没有在网上找到任何答案,但看到有人在其他地方问同样的问题但没有解决方案。

谢谢(注意:我不是一个经验丰富的程序员,除了这个笨拙的部分,我的代码的其余部分将非常基础)

引用 the python-docx documentation:

The Document.add_picture() method adds a specified picture to the end of the document in a paragraph of its own. However, by digging a little deeper into the API you can place text on either side of the picture in its paragraph, or both.

当我们"dig a little deeper"时,我们发现Run.add_picture()API。

这是一个使用示例:

from docx import Document
from docx.shared import Inches

document = Document()

p = document.add_paragraph()
r = p.add_run()
r.add_text('Good Morning every body,This is my ')
r.add_picture('/tmp/foo.jpg')
r.add_text(' do you like it?')

document.save('demo.docx')

好吧,我不知道这是否适用于您,但这是我将特定位置的图像设置为 docx 文档的方法: 我创建了一个基本的 docx 文档(模板文档)。在此文件中,我插入了一些无边框的 table,用作图像的占位符。创建文档时,首先我打开模板,然后更新在 table 中创建图像的文件。所以代码本身与您的原始代码没有太大区别,唯一的区别是我在特定的 table.

中创建段落和图像
from docx import Document
from docx.shared import Inches

doc = Document('addImage.docx')
tables = doc.tables
p = tables[0].rows[0].cells[0].add_paragraph()
r = p.add_run()
r.add_picture('resized.png',width=Inches(4.0), height=Inches(.7))
p = tables[1].rows[0].cells[0].add_paragraph()
r = p.add_run()
r.add_picture('teste.png',width=Inches(4.0), height=Inches(.7))
doc.save('addImage.docx')

这是我的解决方案。它在第一个命题上的优势在于它用标题(样式 Header 1)和附加评论部分包围图片。请注意,您必须按照它们在 Word 文档中出现的相反顺序进行插入。

如果您想以编程方式在现有文档中插入图片,此代码段特别有用。

from docx import Document
from docx.shared import Inches

# ------- initial code -------

document = Document()

p = document.add_paragraph()
r = p.add_run()
r.add_text('Good Morning every body,This is my ')
picPath = 'D:/Development/Python/aa.png'
r.add_picture(picPath)
r.add_text(' do you like it?')

document.save('demo.docx')

# ------- improved code -------

document = Document()

p = document.add_paragraph('Picture bullet section', 'List Bullet')
p = p.insert_paragraph_before('')
r = p.add_run()
r.add_picture(picPath)
p = p.insert_paragraph_before('My picture title', 'Heading 1')

document.save('demo_better.docx')

这是采用了 Robᵩ 写的答案,同时考虑了用户更灵活的输入。 我的假设是 Kais Dkhili(原始询问者)提到的 HTML 字段已经加载到 docx.Document() 中。所以...

确定文档中相关 HTML 文本的位置。

import re 
## regex module

img_tag = re.compile(r'%\(profile_img\)s') # declare pattern

for _p in enumerate(document.paragraphs): 
    if bool(img_tag.match(_p.text)): 
        
        img_paragraph = _p 
        # if and only if; suggesting img_paragraph a list and 
        # use append method instead for full document search 
        
        break # lose the break if want full document search

将所需图像替换为标识为 img_tag = '%(profile_img)s'

的占位符

下面的代码是考虑到文本只包含一个 run 如果条件不同,可能会相应更改

temp_text = img_tag.split(img_paragraph.text)

img_paragraph.runs[0].text = temp_text[0] 

_r = img_paragraph.add_run()
_r.add_picture('profile_img.png', width = Inches(1.25))

img_paragraph.add_run(temp_text[1])

完成。 document.save() 如果最终确定。

如果您想知道 temp_text 会发生什么...

[In]

img_tag.split(img_paragraph.text)

[Out]

['This is my ', ' do you like it?']

我花了几个小时在里面。如果您需要使用 python 将图像添加到模板文档文件,最好的解决方案是使用 python-docx-template 库。 文档可用 here here

中可用的示例

这是主题的变体。设I为具体文档中的段落编号:

p = doc.paragraphs[I].insert_paragraph_before('\n')
p.add_run().add_picture('Fig01.png', width=Cm(15))