¿Agregar una imagen en una posición específica en el documento (.docx) con Python?

Uso Python-docx para generar un documento de Microsoft Word. El usuario desea que cuando escriba para, por ejemplo: “Buenos días a todos, este es mi% (profile_img) s, ¿te gusta?” en un campo HTML, creo un documento de Word y recupero la imagen del usuario de la base de datos y sustituyo la palabra clave% (profile_img) por la imagen del usuario NO al FINAL DEL DOCUMENTO . Con Python-docx usamos esta instrucción para agregar una imagen:

document.add_picture('profile_img.png', width=Inches(1.25)) 

La imagen se agrega al documento, pero el problema es que se agrega al final del documento. ¿Es imposible agregar una imagen en una posición específica en un documento de Microsoft Word con python? No he encontrado ninguna respuesta a esto en la red, pero he visto a personas que preguntan lo mismo en otros lugares sin ninguna solución.

Gracias (nota: no soy un progtwigdor de gran experiencia y aparte de esta parte incómoda, el rest de mi código será muy básico)

Citando la documentación de python-docx :

El método Document.add_picture () agrega una imagen específica al final del documento en un párrafo propio. Sin embargo, al profundizar un poco más en la API, puede colocar texto en cualquier lado de la imagen en su párrafo, o en ambos.

Cuando “profundizamos un poco más”, descubrimos la API Run.add_picture() .

Aquí hay un ejemplo de su uso:

 from docx import Document from docx.shared import Inches document = Document() p = document.add_paragraph() r = p.add_run() r.add_text('Good Morning every body,This is my ') r.add_picture('/tmp/foo.jpg') r.add_text(' do you like it?') document.save('demo.docx') 

Bueno, no sé si esto se aplicará a usted, pero esto es lo que he hecho para configurar una imagen en un lugar específico en un documento docx: creé un documento docx base (documento de plantilla). En este archivo, he insertado algunas tablas sin bordes, para usarlas como marcadores de posición para las imágenes. Al crear el documento, primero abro la plantilla y actualizo el archivo creando las imágenes dentro de las tablas. Así que el código en sí no es muy diferente del código original, la única diferencia es que estoy creando el párrafo y la imagen dentro de una tabla específica.

 from docx import Document from docx.shared import Inches doc = Document('addImage.docx') tables = doc.tables p = tables[0].rows[0].cells[0].add_paragraph() r = p.add_run() r.add_picture('resized.png',width=Inches(4.0), height=Inches(.7)) p = tables[1].rows[0].cells[0].add_paragraph() r = p.add_run() r.add_picture('teste.png',width=Inches(4.0), height=Inches(.7)) doc.save('addImage.docx') 

Aquí está mi solución. Tiene la ventaja sobre la primera proposición de que rodea la imagen con un título (con estilo Encabezado 1) y una sección para comentarios adicionales. Tenga en cuenta que debe realizar las inserciones en el orden inverso al que aparecen en el documento de Word.

Este fragmento de código es particularmente útil si desea insertar imágenes en un documento existente mediante progtwigción.

 from docx import Document from docx.shared import Inches # ------- initial code ------- document = Document() p = document.add_paragraph() r = p.add_run() r.add_text('Good Morning every body,This is my ') picPath = 'D:/Development/Python/aa.png' r.add_picture(picPath) r.add_text(' do you like it?') document.save('demo.docx') # ------- improved code ------- document = Document() p = document.add_paragraph('Picture bullet section', 'List Bullet') p = p.insert_paragraph_before('') r = p.add_run() r.add_picture(picPath) p = p.insert_paragraph_before('My picture title', 'Heading 1') document.save('demo_better.docx') 

Puedes usarlo

document.add_picture (settings.MEDIA_ROOT + ‘/ image / cta-header3-min.png’, width = Inches (5.8))

settings.MEDIA_ROOT Ruta de ubicación del archivo