используйте UTF-8 в docxtpl (DocxTemplate) и Jinja2

#python #templates #utf-8 #jinja2 #docx

#python #шаблоны #utf-8 #jinja2 #docx

Вопрос:

Я создаю документы docx с помощью docxtpl и Jinja2. Я создал его, используя, как описано в руководстве, матрицу / словарь python, загружаемый данными из XML-файлов. Когда XML-файлы хранят данные latin-1, мои документы хорошо генерируются, но когда содержимое находится в кодировке utf-8 (например, на польском языке) Jinja2 или docxtpl не сохраняют эту кодировку, и docx, по-видимому, плохо отформатирован.

Как передать параметр кодировки или обвести эту проблему?

Мой процесс очень прост:

 doc = DocxTemplate(<my_jinja2_docx_template>)
doc.render(<my_dictionnary_with_data>)
doc.save(<my_docx_file>)
  

Большое спасибо

Ответ №1:

Взгляните на исходный код DocxTemplate класса по адресу https://github.com/elapouya/python-docx-template/blob/master/docxtpl/template.py . По-видимому, нет возможности изменить параметр кодировки. Однако вы можете добавить эту функциональность, создав свой собственный дочерний класс и заменив метод класса xml_to_string . Похоже, именно там указана кодировка. Синтаксис для дочернего класса будет выглядеть следующим образом:

 class NewDocxTemplate(DocxTemplate):
    def xml_to_string(self, xml):
        return etree.tostring(xml, encoding=<your_encoding_here>, pretty_print=False)
  

Затем создайте экземпляр NewDocxTemplate() вместо DocxTemplate() . Все методы DocxTemplate() будут унаследованы, кроме того, который вы изменили.