web-dev-qa-db-ja.com

Pythonを使用してドキュメント(.docx)の特定の位置に画像を追加しますか?

私はPython-docxを使用してMicrosoft Word文書を生成します。たとえば、「おはようございます、すべてのボディ、これは私の%(profile_img)が好きですか?」 HTMLフィールドで、Word文書を作成し、データベースからユーザーの写真を取り戻し、キーWord%(profile_img)sをユーザーの写真で置き換えますドキュメントの最後ではありません。 Python-docxでは、次の命令を使用して画像を追加します。

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

画像はドキュメントに追加されますが、ドキュメントの最後に追加されるという問題があります。 PythonでMicrosoft Word文書の特定の位置に画像を追加することは不可能ですか?私はネットでこれに対する答えを見つけていませんが、他の場所で同じことを求めて解決策がない人々を見てきました。

ありがとう(注:私は大した経験のないプログラマーではありません。この厄介な部分以外は、コードの残りの部分は非常に基本的です)

12
Kais Dkhili

引用 python-docxドキュメント

Document.add_picture()メソッドは、指定された画像を独自の段落のドキュメントの最後に追加します。ただし、APIをもう少し深く掘り下げることにより、段落内の画像のどちらか、または両方にテキストを配置できます。

「もう少し掘り下げる」と、 Run.add_picture() APIが見つかります。

以下はその使用例です。

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ᵩ

まあ、これがあなたに当てはまるかどうかはわかりませんが、特定のスポットの画像をdocxドキュメントに設定するために私が行ったことは次のとおりです:ベースdocxドキュメント(テンプレートドキュメント)を作成しました。このファイルでは、画像のプレースホルダーとして使用するために、境界線のないいくつかのテーブルを挿入しました。ドキュメントを作成するときは、まずテンプレートを開き、テーブル内に画像を作成するファイルを更新します。そのため、コード自体は元のコードと大差ありません。唯一の違いは、特定のテーブル内に段落と画像を作成していることです。

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

これが私の解決策です。最初の命題の利点は、タイトル(スタイルヘッダー1)と追加コメントのセクションで画像を囲むことです。 Word文書に表示されるのとは逆の順序で挿入する必要があることに注意してください。

このスニペットは、既存のドキュメントにプログラムで画像を挿入する場合に特に役立ちます。

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