我使用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文档中的特定位置添加图片是不可能的?我没有在网上找到任何答案,但已经看到人们在其他地方要求同样没有解决方案。
谢谢(注意:我不是一个非常体验的程序员,除了这个尴尬的部分,我的其余代码将非常基本)
答案 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字段已经加载到!
中。所以...
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)
答案 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%' ;