elapouya / python-docx-template

Use a docx as a jinja2 template
GNU Lesser General Public License v2.1
1.98k stars 385 forks source link

SubDocs not rendering in LibreOffice/OpenOffice #537

Open Daniel-Sennewald opened 5 months ago

Daniel-Sennewald commented 5 months ago

Describe the bug

When creating subdocs with doc.new_subdoc() and opening the resulting docx file with LibreOffice, the subdoc is not visibile. When opening the SAME .docx file with word, the subdoc content is correctly shown.

To Reproduce

Note: .docx files are attached.

import docxtpl

main_doc_context = {
    "test": "main doc test text",
}

sub_doc_context = {
    "test": "sub doc test text",
}

subdoc = docxtpl.DocxTemplate("./test_libre_sub.docx")
subdoc.render(sub_doc_context)
subdoc.save("./test_libre_sub_rendered.docx")

main_doc = docxtpl.DocxTemplate("./test_libre.docx")
rendered_subdoc = main_doc.new_subdoc("./test_libre_sub_rendered.docx")
main_doc_context["subdoc1"] = rendered_subdoc

main_doc.render(main_doc_context)
main_doc.save("./test_libre_rendered.docx")

test_libre_sub.docx test_libre.docx

Open the file test_libre_rendered.docx with Word and with LibreOffice. Word renders the subdoc contents, LibreOffice does not.

Expected behavior

When opening the doc with either libreoffice the subdoc should be rendered.

Additional Info

Note that the subdoc itself ("./test_libre_sub_rendered.docx") correctly includes the rendered subdoc.

Tested on:

Mac (Intel) x64 OpenOffice: 4.1.15 LibreOffice: 24.2.2

ScriptSathi commented 4 months ago

Up

The example given in the tests does not work for me. When I merge the docx I have just not visible content in the file. The content is not visible using LibreOffice/Google Docs/Word, BUT it does actually appear inside the XML data. Which means that it is being written in the doc but probably the wrong way ?

ScriptSathi commented 4 months ago

@elapouya sorry for the ping, I have seen you wrote the part of the code related to merging documents. Do you have any hint to give us for this bug ?

I'm using python 3.12.3 and docxtpl version 0.17.0

Thanks

elapouya commented 4 months ago

It requires good understanding of docx format to answer your question. Unfortunately I do not have sufficient knowledge about that, sorry

Le mar. 7 mai 2024 à 12:06, ScriptSathi @.***(mailto:Le mar. 7 mai 2024 à 12:06, ScriptSathi < a écrit :

@.***(https://github.com/elapouya) sorry for the ping, I have seen you wrote the part of the code related to merging documents. Do you have any hint to give us for this bug ?

I'm using python 3.12.3 and docxtpl version 0.17.0

Thanks

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

pemontto commented 1 week ago

Running into this as well. It renders in Word, but interestingly when exporting from Sharepoint as a PDF it goes missing. Opening and printing to PDF retains it.

pemontto commented 1 week ago

OK so for me, I found that I can only see subdocuments when included with a {{p subdoc }}. However when I would insert a subdoc with a table with {{p subdoc }} it would break MS Word. Using {{ subdoc }} would work in word but break everything else. The solution I've found to work is to ensure the last element in the subdoc is a paragraph so {{p subdoc }} works.

This may be brittle but worked for me 🤷‍♂️:

from docx.oxml.text.paragraph import CT_P

# Don't finish run without a paragraph, it corrupts the xml
elements = list(subdoc.element.body)
if len(elements) > 1 and not isinstance(elements[-2], CT_P):
    subdoc.add_paragraph()