python-docx不添加图片

ptr*_*x01 5 python python-docx

我正在尝试使用 python-docx 将图片插入到 Word 文档中,但遇到错误。

代码很简单:

document.add_picture("test.jpg", width = Cm(2.0))
Run Code Online (Sandbox Code Playgroud)

通过查看 python-docx 文档,我可以看到应该生成以下 XML:

<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
  <pic:nvPicPr>
    <pic:cNvPr id="1" name="python-powered.png"/>
    <pic:cNvPicPr/>
  </pic:nvPicPr>
  <pic:blipFill>
    <a:blip r:embed="rId7"/>
    <a:stretch>
      <a:fillRect/>
    </a:stretch>
  </pic:blipFill>
  <pic:spPr>
    <a:xfrm>
      <a:off x="0" y="0"/>
      <a:ext cx="859536" cy="343814"/>
    </a:xfrm>
    <a:prstGeom prst="rect"/>
  </pic:spPr>
</pic:pic>
Run Code Online (Sandbox Code Playgroud)

这实际上是在我的 document.xml 文件中生成的。(解压 docx 文件时)。然而,查看 OOXML 格式,我可以看到图像也应该保存在media文件夹下,并且关系应该映射在word/_rels/document.xml 中:

<Relationship Id="rId20"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
Target="media/image20.png"/>
Run Code Online (Sandbox Code Playgroud)

然而,这一切都没有发生,当我打开 Word 文档时,我遇到了“图片无法显示”占位符。

谁能帮助我了解发生了什么事?

看起来图像没有按应有的方式嵌入,我需要将其插入媒体文件夹并为其添加映射,但是作为一个记录良好的功能,这应该按预期工作。

更新:

使用空的 docx 文件对其进行测试,图像确实按预期添加,这让我相信它可能与 python-docx-template 库有关。(https://github.com/elapouya/python-docx-template

它使用 python-docx 和 jinja 来允许模板功能,但运行和工作方式与 python-docx应该相同。我将图像添加到子文档中,然后将其插入到给定位置的完整文档中。

示例代码如下(来自https://github.com/elapouya/python-docx-template/blob/master/tests/subdoc.py):

from docxtpl import DocxTemplate
from docx.shared import Inches

tpl=DocxTemplate('test_files/subdoc_tpl.docx')

sd = tpl.new_subdoc()
sd.add_paragraph('A picture :')
sd.add_picture('test_files/python_logo.png', width=Inches(1.25))

context = {
    'mysubdoc' : sd,
}

tpl.render(context)
tpl.save('test_files/subdoc.docx')
Run Code Online (Sandbox Code Playgroud)

ptr*_*x01 4

我会继续这样做,以防其他人犯和我一样的错误:)我最终成功地调试了它。

问题在于我如何使用 python-docx-template 库。我打开了一个 DocxTemplate,如下所示:

    report_output = DocxTemplate(template_path)
    DoThings(value,template_path)
    report_output.render(dictionary)
    report_output.save(output_path)
Run Code Online (Sandbox Code Playgroud)

但我不小心打开了两次。在使用模板时,我没有将模板传递给函数,而是传递了一个路径,并在创建子文档并构建它们时再次打开它。

def DoThings(data,template_path):
    doc = DocxTemplate(template_path)
    temp_finding = doc.new_subdoc()
    #DO THINGS
Run Code Online (Sandbox Code Playgroud)

最后,在构建了子文档之后,我渲染了第一个模板,该模板似乎适用于段落等,但我猜测图像已添加到“第二个”打开的模板中,而不是添加到我实际渲染的第一个模板中。将模板传递给函数后,它开始按预期工作!