diff --git a/CHANGES.rst b/CHANGES.rst index c5dd815..e7fcb37 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,7 @@ +0.11.4 (2021-04-06) +------------------- +- It is now possible to put InlineImage in header/footer + 0.11.2 (2020-11-09) ------------------- - fix #323 diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index b5a372f..734e2d5 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ Created : 2015-03-12 @author: Eric Lapouyade """ -__version__ = '0.11.3' +__version__ = '0.11.4' import functools import io @@ -41,6 +41,7 @@ class DocxTemplate(object): self.zipname_to_replace = {} self.pic_to_replace = {} self.pic_map = {} + self.current_rendering_part = None def __getattr__(self, name): return getattr(self.docx, name) @@ -208,9 +209,10 @@ class DocxTemplate(object): return src_xml - def render_xml(self, src_xml, context, jinja_env=None): + def render_xml_part(self, src_xml, part, context, jinja_env=None): src_xml = src_xml.replace(r'', '\n') try: + self.current_rendering_part = part if jinja_env: template = jinja_env.from_string(src_xml) else: @@ -266,7 +268,7 @@ class DocxTemplate(object): def build_xml(self, context, jinja_env=None): xml = self.get_xml() xml = self.patch_xml(xml) - xml = self.render_xml(xml, context, jinja_env) + xml = self.render_xml_part(xml, self.docx._part, context, jinja_env) return xml def map_tree(self, tree): @@ -274,10 +276,13 @@ class DocxTemplate(object): body = root.body root.replace(body, tree) - def get_headers_footers_xml(self, uri): + def get_headers_footers(self, uri): for relKey, val in self.docx._part._rels.items(): if (val.reltype == uri) and (val.target_part.blob): - yield relKey, self.xml_to_string(parse_xml(val.target_part.blob)) + yield relKey, val.target_part + + def get_part_xml(self, part): + return self.xml_to_string(parse_xml(part.blob)) def get_headers_footers_encoding(self, xml): m = re.match(r'<\?xml[^\?]+\bencoding="([^"]+)"', xml, re.I) @@ -286,10 +291,11 @@ class DocxTemplate(object): return 'utf-8' def build_headers_footers_xml(self, context, uri, jinja_env=None): - for relKey, xml in self.get_headers_footers_xml(uri): + for relKey, part in self.get_headers_footers(uri): + xml = self.get_part_xml(part) encoding = self.get_headers_footers_encoding(xml) xml = self.patch_xml(xml) - xml = self.render_xml(xml, context, jinja_env) + xml = self.render_xml_part(xml, part, context, jinja_env) yield relKey, xml.encode(encoding) def map_headers_footers_xml(self, relKey, xml): @@ -636,7 +642,8 @@ class DocxTemplate(object): xml = self.get_xml() xml = self.patch_xml(xml) for uri in [self.HEADER_URI, self.FOOTER_URI]: - for relKey, _xml in self.get_headers_footers_xml(uri): + for relKey, part in self.get_headers_footers(uri): + _xml = self.get_part_xml(part) xml += self.patch_xml(_xml) if jinja_env: env = jinja_env @@ -806,7 +813,7 @@ class InlineImage(object): self.width, self.height = width, height def _insert_image(self): - pic = self.tpl.docx._part.new_pic_inline( + pic = self.tpl.current_rendering_part.new_pic_inline( self.image_descriptor, self.width, self.height diff --git a/tests/header_footer_inline_image.py b/tests/header_footer_inline_image.py new file mode 100644 index 0000000..b2303d0 --- /dev/null +++ b/tests/header_footer_inline_image.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +''' +Created : 2021-04-06 + +@author: Eric Lapouyade +''' + +from docxtpl import DocxTemplate, InlineImage + +# for height and width you have to use millimeters (Mm), inches or points(Pt) class : +from docx.shared import Mm + +tpl = DocxTemplate('templates/header_footer_inline_image_tpl.docx') + +context = { + 'inline_image': InlineImage(tpl, 'templates/django.png', height=Mm(10)) +} +tpl.render(context) +tpl.save('output/header_footer_inline_image.docx') diff --git a/tests/templates/header_footer_inline_image_tpl.docx b/tests/templates/header_footer_inline_image_tpl.docx new file mode 100644 index 0000000..87d0cb4 Binary files /dev/null and b/tests/templates/header_footer_inline_image_tpl.docx differ