web-dev-qa-db-fra.com

Ajouter une image dans une position spécifique dans le document (.docx) avec Python?

J'utilise Python-docx pour générer un document Microsoft Word. L'utilisateur veut que quand il écrit par exemple: "Bonjour tout le monde, ceci est mon% (profile_img) s vous l'aimez?" dans un champ HTML, je crée un document Word et je récupère la photo de l'utilisateur de la base de données et je remplace la clé Word% (profile_img) s par la photo de l'utilisateur PAS à la FIN DU DOCUMENT. Avec Python-docx, nous utilisons cette instruction pour ajouter une image:

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

L'image est ajoutée au document mais le problème est qu'elle soit ajoutée à la fin du document. Est-il impossible d'ajouter une image dans une position spécifique dans un document Microsoft Word avec python? Je n'ai trouvé aucune réponse à cela sur le net mais j'ai vu des gens demander la même chose ailleurs sans solution.

Merci (note: je ne suis pas un programmeur extrêmement expérimenté et à part cette partie maladroite, le reste de mon code sera très basique)

12
Kais Dkhili

Citant la documentation python-docx :

La méthode Document.add_picture () ajoute une image spécifiée à la fin du document dans un paragraphe à part. Cependant, en creusant un peu plus profondément dans l'API, vous pouvez placer du texte de chaque côté de l'image dans son paragraphe, ou les deux.

Lorsque nous "creusons un peu plus profondément", nous découvrons l'API Run.add_picture() .

Voici un exemple de son utilisation:

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')
13
Robᵩ

eh bien, je ne sais pas si cela s'appliquera à vous, mais voici ce que j'ai fait pour définir une image dans un endroit spécifique sur un document docx: j'ai créé un document docx de base (document modèle). Dans ce fichier, j'ai inséré des tableaux sans bordures, à utiliser comme espaces réservés pour les images. Lors de la création du document, j'ouvre d'abord le modèle et met à jour le fichier créant les images à l'intérieur des tableaux. Ainsi, le code lui-même n'est pas très différent de votre code d'origine, la seule différence est que je crée le paragraphe et l'image dans un tableau spécifique.

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')
10
Wand

Voici ma solution. Il a l'avantage sur la première proposition qu'il entoure l'image d'un titre (avec le style En-tête 1) et d'une section pour des commentaires supplémentaires. Notez que vous devez effectuer les insertions dans l'ordre inverse de leur apparition dans le document Word.

Cet extrait est particulièrement utile si vous souhaitez insérer par programme des images dans un document existant.

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')
2