Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to display image in python docx template (docxtpl)? Django Python

I am using python-docx-template (docxtpl) to generate a .docx file. With this data:

docente= {
   "id":145,
   "lugar_de_nacimiento":"Loja",
   "fecha_de_nacimiento":"1973-04-14",
   "ciudad":"Loja",
   "foto_web_low":"https://sica.utpl.edu.ec/media/uploads/docentes/fotos/web/low/1102904313_low.jpg"
}

I have a function where I pass the image docente['foto_web_low'] to the context and the path of the template:

from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm

def generaraDocumento(request):
    response = HttpResponse(content_type='application/msword')
    response['Content-Disposition'] = 'attachment; filename="cv.docx"'

    doc = DocxTemplate(str(settings.BASE_DIR) + '/cv_api/templates/docx_filename.docx')
    imagen = docente['foto_web_low'] 

    context = {'imagen': imagen}

    doc.render(context)
    doc.save(response)

    return response

The template where I have the image that I want to show docx_filename.docx has this:

The template where I have the data that I want to show docx_filename.docx has this:

Image: {{ imagen }} 

When the document is generated, I only get the URL address and not the image, in my template it returns this:

Image: https://sica.utpl.edu.ec/media/uploads/docentes/fotos/web/low/1102904313_low.jpg

How can I make the image appear in the document .docx (docxtpl). Thanks in advance.

like image 320
Fernando Javier León Avatar asked Oct 25 '25 15:10

Fernando Javier León


1 Answers

The image has to be an instance of docxtpl.InlineImage (see docs).

Another important thing is that the image must be present on the disk. docxtpl doesn't support reading images from a url.

Example:

from docxtpl import InlineImage
from docx.shared import Mm


doc = DocxTemplate(str(settings.BASE_DIR) + '/cv_api/templates/docx_filename.docx')

# The image must be already saved on the disk
# reading images from url is not supported
imagen = InlineImage(doc, '/path/to/image/file.jpg', width=Mm(20)) # width is in millimetres

context = {'imagen': imagen}

# ... the rest of the code remains the same ...
like image 180
xyres Avatar answered Oct 27 '25 05:10

xyres