概要
- 理系学生が論文執筆するとき、実験や研究の結果画像をまとめてWordに張り付けることが良くあると思います。
- 画像が数枚であれば貼り付けに苦労しませんが、何十枚もある場合はかなり面倒になります(位置・大きさの調整など...)。
- そこで、本記事ではPythonのdocxライブラリを使用してこれを自動化する方法を紹介します。(↓こんな感じのモノを作成)
input.docx(処理前) | |
---|---|
output2.docx(処理後) |
パッケージのインストール
Python Docx :: Anaconda.orgを参考に、以下のコマンドを実行してpython-docxをインストール
conda install conda-forge::python-docx
docxを使用した画像の挿入
- 画像は表に挿入すると見やすく整列されるので、これをPythonで自動化します。
解説詳細
インポート
import docx from docx.shared import Mm //画像などの大きさをミリ単位で設定できるようにする from docx.enum.text import WD_ALIGN_PARAGRAPH //中央揃えするときに使用
ファイルの読み取り
#ファイル名を指定して読み込み doc = docx.Document('input.docx')
操作したいテーブルの取得
- 表の枠線をなくしてもWord上だと点線で表示されますが、pdfなどに出力したときは消えます。
# 該当する番号の表を取得して、枠線をなくす table = doc.tables[0] table.style = 'Normal Table'
操作したいテーブルの取得
- リストなどと同じように文書内の最初の表が0番、それ以降は1, 2, 3, ..., n番目となります。
- 表の枠線をなくしてもWord上だと点線で表示されますが、pdfなどに出力したときは消えます。
# 該当する番号の表を取得して、枠線をなくす table = doc.tables[0] table.style = 'Normal Table'
セルの取得
- rowsが縦方向、cellsが横方向に何番目かを示します。
p1 = table.rows[0].cells[0].paragraphs[0] p1.alignment = WD_ALIGN_PARAGRAPH.CENTER // 中央揃え
画像の挿入
r1 = p1.add_run() r1.add_picture('square.png', Mm(20)) //第一引数が画像のパス、第二引数が大きさ
テキストの挿入
- 画像挿入の時と同様にします。
p2 = table.rows[1].cells[0].paragraphs[0] p2.alignment = WD_ALIGN_PARAGRAPH.CENTER p2.text = "(a)square"
ファイルの保存
doc.save("output1.docx")
完成したコードと実行結果
ソースコード
import docx from docx.shared import Mm from docx.enum.text import WD_ALIGN_PARAGRAPH #ファイル名を指定して読み込み doc = docx.Document('input.docx') # 該当する番号の表を取得して、枠線をなくす table = doc.tables[0] table.style = 'Normal Table' # セル(0, 0)を選択して中央揃えにする p1 = table.rows[0].cells[0].paragraphs[0] p1.alignment = WD_ALIGN_PARAGRAPH.CENTER # サイズ指定して画像挿入 r1 = p1.add_run() r1.add_picture('square.png', Mm(20)) # 同様にセル(0, 1)を選択して中央揃えにする p2 = table.rows[1].cells[0].paragraphs[0] p2.alignment = WD_ALIGN_PARAGRAPH.CENTER p2.text = "(a)square" #保存 doc.save("output1.docx")
実行結果
複数枚の画像で実践
- 本記事の目的は複数枚の画像で行うことでしたので、for文を使いこれを実現します。
- 完成すると、最初に示したような画像が出ます。
import docx from docx.shared import Mm from docx.enum.text import WD_ALIGN_PARAGRAPH #ファイル名を指定して読み込み doc = docx.Document('input.docx') # 表番号と挿入したい画像名リストの辞書 img_dict = { 0: {'circle.png', 'hurt.png', 'moon.png', 'square.png'}, 1: {'star.png', 'triangle.png'}, } # ループ for n, imgPaths in img_dict.items(): # 該当する番号の表を取得して、枠線をなくす table = doc.tables[n] table.style = 'Normal Table' # 画像&図名を挿入 for index, imgPath in enumerate(imgPaths): # 画像 p1 = table.rows[2 * (index // 2)].cells[index % 2].paragraphs[0] p1.alignment = WD_ALIGN_PARAGRAPH.CENTER r = p1.add_run() r.add_picture(imgPath, Mm(20)) # 図名 p2 = table.rows[1 + 2 * (index // 2)].cells[index % 2].paragraphs[0] p2.alignment = WD_ALIGN_PARAGRAPH.CENTER p2.text = imgPath #保存 doc.save("output2.docx")