0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

先輩の修論で appendix 作成を手伝った話

Posted at

背景

先輩の研究テーマはざっっくりいうとコンクリートについて。研究で電子顕微鏡(SEM)を使って写真を撮り、修論の appendix に収録するとのことでした。
一見簡単なようですが、画像は合計で数百枚あり、高さと幅ともに大きい bmp ファイルのため、Word に貼り付けていくとフリーズしかけるらしい。まず bmp を諦めて png を勧めてみましたが、細部が崩れるからなるべく避けたいとのこと。そこで思い当たったのが python-docx です。python-docx は Python で Word を扱うライブラリです。存在は知っていたものの、直接 Word に書き込んだほうが楽だと考えて今までスルーしていました。しかし、今回のように画像を貼っていくだけなら適用できそうです。

appendix は画像だけを載せ、各ページに載せる枚数は何枚でもいい。各画像にはキャプションをつけたい。画像ファイルは連番となっていて、番号順に載せてほしい。

とのこと。私には Python で遊んでくださいと言われているような気がしました(幻聴)

やったこと

まず大量の bmp をもらい、python-docx で Word を作ります。修論データの代用として、フリー素材.com より愛すべきイッヌの写真をお借りしました。かわいい…
image.png

temp フォルダーに以下のスクリプトを作り、実行しました。

wordに画像を貼り付ける.py
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")

Word を出力できました!
image.png

感想

実際のデータでやると、bmp 画像を貼り付けるのに数分かかりました。重すぎぃ。一方、イッヌファイルは 0 秒で作れました。軽すぎぃ。あと、柴犬可愛すぎぃ。私の知識不足もありますが、python-docx が使える珍しい場面だったと思います。 よければ、python-docx の実務への適用例をコメントにて教えていただけると嬉しいです。

参考

python-docxでWORD文章に表を作成して画像とテキストを貼り付ける

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?