# -*- coding: utf-8 -*- """ Created : 2021-07-30 @author: Eric Lapouyade """ from docx.oxml import OxmlElement, parse_xml from docx.oxml.ns import qn class InlineImage(object): """Class to generate an inline image This is much faster than using Subdoc class. """ tpl = None image_descriptor = None width = None height = None anchor = None def __init__(self, tpl, image_descriptor, width=None, height=None, anchor=None): self.tpl, self.image_descriptor = tpl, image_descriptor self.width, self.height = width, height self.anchor = anchor def _add_hyperlink(self, run, url, part): # Create a relationship for the hyperlink r_id = part.relate_to( url, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", is_external=True, ) # Find the and element docPr = run.xpath(".//wp:docPr")[0] cNvPr = run.xpath(".//pic:cNvPr")[0] # Create the element hlinkClick1 = OxmlElement("a:hlinkClick") hlinkClick1.set(qn("r:id"), r_id) hlinkClick2 = OxmlElement("a:hlinkClick") hlinkClick2.set(qn("r:id"), r_id) # Insert the element right after the element docPr.append(hlinkClick1) cNvPr.append(hlinkClick2) return run def _insert_image(self): pic = self.tpl.current_rendering_part.new_pic_inline( self.image_descriptor, self.width, self.height, ).xml if self.anchor: run = parse_xml(pic) if run.xpath(".//a:blip"): hyperlink = self._add_hyperlink( run, self.anchor, self.tpl.current_rendering_part ) pic = hyperlink.xml return ( "%s" '' % pic ) def __unicode__(self): return self._insert_image() def __str__(self): return self._insert_image() def __html__(self): return self._insert_image()