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

时间:2015-10-04 09:59:44

标签: python image python-2.7 python-docx

我使用Python-docx生成Microsoft Word文档。用户想要的时候,例如:“早安,每个人,这是我的%(profile_img)你喜欢吗?” 在HTML字段中,我创建一个word文档,我从数据库中恢复用户的图片,然后用用户的图片替换关键字%(profile_img)s NOT在文档的末尾。使用Python-docx,我们使用此指令添加图片:

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

图片已添加到文档中,但问题是在文档末尾添加了该图片。 使用python在microsoft word文档中的特定位置添加图片是不可能的?我没有在网上找到任何答案,但已经看到人们在其他地方要求同样没有解决方案。

谢谢(注意:我不是一个非常体验的程序员,除了这个尴尬的部分,我的其余代码将非常基本)

7 个答案:

答案 0 :(得分:10)

引用the python-docx documentation

  

Document.add_picture()方法将指定的图片添加到文档末尾的段落中。但是,通过深入挖掘API,您可以将文本放在图片的两侧,或两者中。

当我们“深入挖掘”时,我们会发现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')

答案 1 :(得分:7)

好吧,我不知道这是否适用于您,但我已经完成了将特定位置的图像设置为docx文档的操作: 我创建了一个基础docx文档(模板文档)。在这个文件中,我插入了一些没有边框的表格,用作图像的占位符。创建文档时,首先打开模板,然后更新在表格内创建图像的文件。因此代码本身与原始代码没有太大区别,唯一的区别是我在特定表格中创建段落和图像。

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')

答案 2 :(得分:1)

这是我的解决方案。它在第一个命题上具有优势,即它用标题(带有样式标题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')

答案 3 :(得分:0)

您可以使用此:

 document.add_picture(settings.MEDIA_ROOT+'/image/cta-header3-min.png', width=Inches(5.8))
  

settings.MEDIA_ROOT 文件位置路径

答案 4 :(得分:0)

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

确定文档中相关HTML文本在哪里。

docx.Document()

将所需图像替换为标识为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]

答案 5 :(得分:0)

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

中提供的示例

答案 6 :(得分:0)

这是一个主题的变体。让我成为特定文档中的段落编号然后:

SELECT * FROM USERS WHERE role_id='3' AND email LIKE '%search_string%' OR first_name LIKE '%search_string%' OR last_name LIKE '%search_string%' ;