Merge branch 'idrisnacer-master'
This commit is contained in:
commit
04d1bfc5fe
@ -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)
|
0.11.2 (2020-11-09)
|
||||||
-------------------
|
-------------------
|
||||||
- fix #323
|
- fix #323
|
||||||
|
|||||||
@ -4,7 +4,7 @@ Created : 2015-03-12
|
|||||||
|
|
||||||
@author: Eric Lapouyade
|
@author: Eric Lapouyade
|
||||||
"""
|
"""
|
||||||
__version__ = '0.11.3'
|
__version__ = '0.11.4'
|
||||||
|
|
||||||
import functools
|
import functools
|
||||||
import io
|
import io
|
||||||
@ -41,6 +41,7 @@ class DocxTemplate(object):
|
|||||||
self.zipname_to_replace = {}
|
self.zipname_to_replace = {}
|
||||||
self.pic_to_replace = {}
|
self.pic_to_replace = {}
|
||||||
self.pic_map = {}
|
self.pic_map = {}
|
||||||
|
self.current_rendering_part = None
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
return getattr(self.docx, name)
|
return getattr(self.docx, name)
|
||||||
@ -208,9 +209,10 @@ class DocxTemplate(object):
|
|||||||
|
|
||||||
return src_xml
|
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'<w:p>', '\n<w:p>')
|
src_xml = src_xml.replace(r'<w:p>', '\n<w:p>')
|
||||||
try:
|
try:
|
||||||
|
self.current_rendering_part = part
|
||||||
if jinja_env:
|
if jinja_env:
|
||||||
template = jinja_env.from_string(src_xml)
|
template = jinja_env.from_string(src_xml)
|
||||||
else:
|
else:
|
||||||
@ -266,7 +268,7 @@ class DocxTemplate(object):
|
|||||||
def build_xml(self, context, jinja_env=None):
|
def build_xml(self, context, jinja_env=None):
|
||||||
xml = self.get_xml()
|
xml = self.get_xml()
|
||||||
xml = self.patch_xml(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
|
return xml
|
||||||
|
|
||||||
def map_tree(self, tree):
|
def map_tree(self, tree):
|
||||||
@ -274,10 +276,13 @@ class DocxTemplate(object):
|
|||||||
body = root.body
|
body = root.body
|
||||||
root.replace(body, tree)
|
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():
|
for relKey, val in self.docx._part._rels.items():
|
||||||
if (val.reltype == uri) and (val.target_part.blob):
|
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):
|
def get_headers_footers_encoding(self, xml):
|
||||||
m = re.match(r'<\?xml[^\?]+\bencoding="([^"]+)"', xml, re.I)
|
m = re.match(r'<\?xml[^\?]+\bencoding="([^"]+)"', xml, re.I)
|
||||||
@ -286,10 +291,11 @@ class DocxTemplate(object):
|
|||||||
return 'utf-8'
|
return 'utf-8'
|
||||||
|
|
||||||
def build_headers_footers_xml(self, context, uri, jinja_env=None):
|
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)
|
encoding = self.get_headers_footers_encoding(xml)
|
||||||
xml = self.patch_xml(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)
|
yield relKey, xml.encode(encoding)
|
||||||
|
|
||||||
def map_headers_footers_xml(self, relKey, xml):
|
def map_headers_footers_xml(self, relKey, xml):
|
||||||
@ -636,7 +642,8 @@ class DocxTemplate(object):
|
|||||||
xml = self.get_xml()
|
xml = self.get_xml()
|
||||||
xml = self.patch_xml(xml)
|
xml = self.patch_xml(xml)
|
||||||
for uri in [self.HEADER_URI, self.FOOTER_URI]:
|
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)
|
xml += self.patch_xml(_xml)
|
||||||
if jinja_env:
|
if jinja_env:
|
||||||
env = jinja_env
|
env = jinja_env
|
||||||
@ -806,7 +813,7 @@ class InlineImage(object):
|
|||||||
self.width, self.height = width, height
|
self.width, self.height = width, height
|
||||||
|
|
||||||
def _insert_image(self):
|
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.image_descriptor,
|
||||||
self.width,
|
self.width,
|
||||||
self.height
|
self.height
|
||||||
|
|||||||
19
tests/header_footer_inline_image.py
Normal file
19
tests/header_footer_inline_image.py
Normal file
@ -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')
|
||||||
BIN
tests/templates/header_footer_inline_image_tpl.docx
Normal file
BIN
tests/templates/header_footer_inline_image_tpl.docx
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user