python-docx能否添加链接至外部图片文件的图片?求可行方案
使用python-docx添加外部链接图片的问题
我正在使用python-docx库生成Word文档。
嵌入图片
可以通过python-docx的API添加嵌入文档的图片,示例代码如下:
from docx import Document doc = Document() par = doc.add_paragraph( 'Embed picture:' ) run = par.add_run() run.add_picture( 'puppy.png' ) doc.save( 'test.docx' )
该图片会成为存储在文档内的ImagePart,对应结构及关系如下:
word/ media/ image1.png
<Relationships ...> ... <Relationship Id="rId4" Type=".../image" Target="media/image1.png"/> </Relationships>
链接图片
我希望添加链接至外部图片文件的图片(Microsoft Word原生支持此功能),但python-docx暂无便捷API。不过其底层代码似乎支持外部文件链接,因此我自行编写工具函数尝试实现,示例代码如下:
from docx import Document doc = Document() par = doc.add_paragraph( 'Link picture:' ) run = par.add_run() Util.Run_add_picture( run, 'puppy.png', is_external = True ) doc.save( 'test.docx' )
预期图片对应的关系为:
<Relationships ...> ... <Relationship Id="rId4" Type=".../image" Target="file:///C:\work\puppy.png" TargetMode="External"/> </Relationships>
我发现docx.opc.part.Part.relate_to()有默认值为false的is_external参数,docx.oxml.shape.CT_Blip有embed和link属性,因此封装了多个工具函数(包括Run.add_picture()、CT_Picture.new()等)并传入is_external=True参数,核心修改代码如下:
@staticmethod def CT_Picture_new( pic_id, filename, relationship_id, cx, cy, is_external ): pic = parse_xml( CT_Picture._pic_xml() ) pic.nvPicPr.cNvPr.id = pic_id pic.nvPicPr.cNvPr.name = filename # 根据is_external参数选择对应属性 if is_external: pic.blipFill.blip.link = relationship_id else: pic.blipFill.blip.embed = relationship_id pic.spPr.cx = cx pic.spPr.cy = cy return pic
但保存文档时仍抛出异常:
TypeError: Argument must be bytes or unicode, got 'ImagePart'
我推测需修改Relationship对象的target_ref属性,使其赋值为外部图片的字符串路径而非ImagePart对象,但暂时无法推进。请问python-docx是否有支持添加外部图片链接的计划?或是否有更简便的解决方法?
内容的提问来源于stack exchange,提问作者Mike Finch
相关产品推荐
相关产品推荐

