From 17a2c6e1fe66734e3d1efdb763fb81778543c9a6 Mon Sep 17 00:00:00 2001 From: Edwin Smulders Date: Wed, 8 Apr 2020 16:48:43 +0200 Subject: [PATCH] Make headers and footers work with both python-docx 0.8.7 and 0.8.10 --- docxtpl/__init__.py | 8 +++++--- setup.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 622ed79..8b7920a 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -12,6 +12,7 @@ __version__ = '0.6.4' from lxml import etree from docx import Document from docx.opc.oxml import serialize_part_xml, parse_xml +from docx.opc.part import XmlPart import docx.oxml.ns from docx.opc.constants import RELATIONSHIP_TYPE as REL_TYPE from jinja2 import Environment, Template, meta @@ -236,8 +237,8 @@ class DocxTemplate(object): def get_headers_footers_xml(self, uri): for relKey, val in self.docx._part._rels.items(): - if (val.reltype == uri) and (val._target._blob): - yield relKey, self.xml_to_string(parse_xml(val._target._blob)) + if (val.reltype == uri) and (val.target_part.blob): + yield relKey, self.xml_to_string(parse_xml(val.target_part.blob)) def get_headers_footers_encoding(self,xml): m = re.match(r'<\?xml[^\?]+\bencoding="([^"]+)"',xml,re.I) @@ -253,7 +254,8 @@ class DocxTemplate(object): yield relKey, xml.encode(encoding) def map_headers_footers_xml(self, relKey, xml): - self.docx._part._rels[relKey]._target._blob = xml + part = self.docx._part._rels[relKey].target_part + self.docx._part._rels[relKey]._target = XmlPart.load(part.partname, part.content_type, xml, part.package) def render(self, context, jinja_env=None, autoescape=False): if autoescape: diff --git a/setup.py b/setup.py index b5b3819..42a559e 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ setup(name='docxtpl', license='LGPL 2.1', packages=['docxtpl'], install_requires=['six', - 'python-docx<=0.8.7', # newer docx package breaks header/footer management in docxtpl + 'python-docx', 'jinja2', 'lxml'], extras_require={'docs': ['Sphinx', 'sphinxcontrib-napoleon']},