我正在尝试使用python-docx将图片插入Word文档但遇到错误 .
代码很简单:
document.add_picture("test.jpg", width = Cm(2.0))
从查看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>
事实上,这确实是在我的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"/>
然而,这一切都没有发生,当我打开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')
1 回答
我会保留这个以防万一其他人设法犯同样的错误:)我设法最终调试它 .
问题在于我如何使用python-docx-template库 . 我这样开了一个DocxTemplate:
但我偶然打开了两次 . 在使用模板时,我没有将模板传递给函数,而是在创建子文件并构建它们时传递了一条路径并再次打开它 .
最后,在我构建了subdocs后,我渲染了第一个模板似乎适用于段落等,但我猜这些图像被添加到“第二个”打开的模板而不是第一个我实际渲染的模板 . 将模板传递给函数后,它开始按预期工作!