背景
先輩の研究テーマはざっっくりいうとコンクリートについて。研究で電子顕微鏡(SEM)を使って写真を撮り、修論の appendix に収録するとのことでした。
一見簡単なようですが、画像は合計で数百枚あり、高さと幅ともに大きい bmp ファイルのため、Word に貼り付けていくとフリーズしかけるらしい。まず bmp を諦めて png を勧めてみましたが、細部が崩れるからなるべく避けたいとのこと。そこで思い当たったのが python-docx
です。python-docx
は Python で Word を扱うライブラリです。存在は知っていたものの、直接 Word に書き込んだほうが楽だと考えて今までスルーしていました。しかし、今回のように画像を貼っていくだけなら適用できそうです。
appendix は画像だけを載せ、各ページに載せる枚数は何枚でもいい。各画像にはキャプションをつけたい。画像ファイルは連番となっていて、番号順に載せてほしい。
とのこと。私には Python で遊んでくださいと言われているような気がしました(幻聴)
やったこと
まず大量の bmp をもらい、python-docx
で Word を作ります。修論データの代用として、フリー素材.com より愛すべきイッヌの写真をお借りしました。かわいい…
temp フォルダーに以下のスクリプトを作り、実行しました。
from docx import Document
from docx.shared import Cm
from docx import shared
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from tqdm import tqdm
import os
os.chdir(os.path.abspath(__file__))
doc = Document()
def to_word():
count = 0
n = 0
for k in tqdm(range(2)): # 実際はもっと大きい数
tables = doc.add_table(rows=3, cols=2)
tables.alignment = WD_TABLE_ALIGNMENT.CENTER
for i in range(3):
for j in range(2):
count += 1
n += 1
fname = rf"修論お手伝い\dog{count}.jpg"
while not os.path.isfile(fname):
count += 1
fname = rf"修論お手伝い\dog{count}.jpg"
s = '図' + str(n)
p = doc.tables[k].rows[i].cells[j].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
# ここのサイズは何度か微調整しました
r.add_picture(fname,width=Cm(6.0), height=Cm(6.0))
r.add_break()
r.add_text(s)
r.font.name = "Times New Roman"
r.font.size = shared.Pt(10.5)
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
doc.save(f'{m}.docx')
for m in range(1): # 実際はもっと大きい数
to_word()
print(f"{m} is finished")
print("Finish")
感想
実際のデータでやると、bmp 画像を貼り付けるのに数分かかりました。重すぎぃ。一方、イッヌファイルは 0 秒で作れました。軽すぎぃ。あと、柴犬可愛すぎぃ。私の知識不足もありますが、 よければ、python-docx
が使える珍しい場面だったと思います。python-docx
の実務への適用例をコメントにて教えていただけると嬉しいです。