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.

Upvotes: 4

Views: 11567

Answers (3)

B I K A
B I K A

Reputation: 11

Resize the image first, before add it
make it fit to your space

from PIL import Image

img = Image.open("image-path")
newimg = img.resize((250, 250))
newimg.save("tmplogo.png")


then use the new sized image which name tmplogo.png

doc = DocxTemplate("Base.docx")
dic = {"logo": InlineImage(doc, "tmplogo.png")}

doc.render(dic)
doc.save("test.docx")

Upvotes: 1

xyres
xyres

Reputation: 21744

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 ...

Upvotes: 5

Jelle
Jelle

Reputation: 339

You're currently linking the variable foto_web_low to the url and not to an actual image. You will need to download the image first, and then attach it. The code below is not tested, but should be in the right direction:

First, dowload the image:

 response = requests.get("https://The_URL_of_the_picture.jpg")
file = open("the_image.png", "wb")
file.write(response.content)
file.close()

And then simply add the image to your variable in the context:

docente= {
   "id":145,
   ...
   "foto_web_low":"the_image.png",
  ...
}

Upvotes: 0

Related Questions