業務効率化の一貫として、ChatGPTを使用したブログを以前書きましたが、今回はPDFから切り出された画像をWordに原寸で貼り込み、且つ、ファイル名もその下に表示させ、画像サイズとファイル名を同時にチェックできるようにする という処理を、「無料のMicrosoft Copilot」を使ってPythonコードを生成してみた というお話です。
目次
Pythonで、画像貼り付けとファイル名表示を自動化できないか・・・
弊社はDTP制作の会社であり、様々な媒体を手掛けております。そんな中、あるクライアントからのお仕事(小学校算数の教科書)で、
- 教科書のPDF紙面から、図版等をpng画像として切り出す
- 切り出したpng画像をWordに貼り付けた際、紙面と同じサイズになるようにして納品する
というお仕事がありました。
小学校教員がWordを使って、教材やプリント、授業資料を作成する際に素材としてこれらの画像が活用されます。
切り出す画像1点1点に付けるファイル名は、先に作成しておいた原稿に従って付けます。例えば1ページ目に図版が3つあったら、上から順番に、1ページ_1.png、1ページ_2.png、1ページ_3.png というような具合です。
切り出されてきたものをチェックする際、10~20点ぐらいであれば手動でWordに貼り付けてサイズを確認すればよいのですが、1~6年生で、総点数が約4,000点もあり、とてもじゃないけど手貼りは厳しいし、ましてやファイル名のチェックはどうすればよいかなぁ~と考えていました。
画像サムネイルとファイル名を表示するだけであれば、市販のソフト(Adobe Bridge)やフリーソフトがあります。が、サムネイル表示ではなく、原寸表示となると、そんなソフトはないのではないか・・・と思い、このような考えに至りました。
Pythonによる画像配置とファイル名表示の実装方法
画像の切り出しはオペレータにお願いするのですが、今回は、画像をどのような形で切り出したのか という説明は置いといて、「原寸で貼り込み、なおかつファイル名も表示させたい」というお話です。
もしこの作業を、ファイル名はウィンドウプリントで出力するなりモニタで見るなりしてチェックをする。切り出した画像はWordに順番に貼り込んでサイズをチェックする。ということをしていたら、非常に効率が悪く、似ている画像があった場合に取り違いがでるかもしれないと思ったからです。
今回はChatGPT-3.5よりも、コード作成支援に重点を置き、且つ無料でGPT-4を使用できるCopilotを使用して、Pythonコードを書いてもらうことにしました。
Copilotを活用したPythonコード生成の手順
Copilot にコードを生成してもらうため、以下のようなプロンプトを投げてみました。
# 命令書: あなたはPythonのスペシャリストです。 以下の制約条件と入力文をもとにPythonコードを生成してください。 # 制約条件: ・初心者にもわかるように、都度生成したコードにコメントを入れてください。 ・コードがエラーにならない程度に分割して具体的に説明してください。 ・インプットする箇所、アウトプットされる箇所を明確にしてください。 ・pythonバージョンは3.9.13です。 # 入力文: 画像が格納されているフォルダがあります。 そのフォルダ内の全ての画像ファイルを取得し、各々の画像を新しいWord文章に100%で配置してください。 そして、各画像の下に、そのファイル名を表示してください。 Png・jpg・gif・bmpでも対応できるようにしてください。 WordのサイズはA4でお願いします。 # 出力文:
上記のプロンプトによりコードが生成されますが、エラーが発生したり、期待にそぐわない結果になることが多々発生します。
その際は、そのエラーをまるごとプロンプトへ投げ返したり、要望に沿うように命令し直してみてください。
そんな紆余曲折を経て、下記のPythonコードが生成されました。
今回はブラウザ上で動作するプログラムの対話型実行環境であるJupyter Labに、マルっとコピペして実行してみます。
プログラムを動かしているディレクトリ内に「output.docx」が生成されました。
Pythonコードの解説
いかがでしょうか。上記のように、わずか14行のコードで作業の自動化が可能となります。
コメント(コードに記載の#以降のテキスト部分)の表示を見れば大方想像がつくかと思いますが、実際にこのコードがどのような処理をしているのかを見ていきたいと思います。
step
1ライブラリをインポートする:
まず初めに、os、Document、Inches という3つのライブラリをインポートしておきます。
ライブラリとは、プログラムを書く際に使える便利な機能やコードの集まりのことです。
- os・・・Pythonでファイルやフォルダを操作するための便利なツール。
- Document・・・Pythonで文書を扱うためのツール。文書の読み込みや、新規文書を作成する。
- Inches・・・Pythonで長さを表すときに使う単位「インチ」に関するツール。1インチ=約2.54cm。
step
2ワード文書を作成する:
最初に、doc = Document()という行で、新しいワード文書を作成しています。
これは、後で画像を追加していくための土台となるもので、空のリストを作っておきます。
step
3ページサイズを設定する:
section = doc.sections[0]で、文書の最初のセクション(ページ)を取得しています。
section.page_heightとsection.page_widthで、ページの高さと幅を設定しています。
ここではA4サイズに設定しています(天地11.69×2.54=297mm、左右8.27×2.54=210mm)。
step
4画像ファイルを処理する:
image_folderには、画像ファイルが格納されているフォルダのパスが入ります。
******にはユーザー名が入り、上記のコードでは「ABCfolder」というフォルダ内に画像が格納されている ということです。
os.listdir(image_folder)で、フォルダ内のファイル名を取得しています。
os.path.isfile(os.path.join(image_folder, f))で、フォルダとアイテムの名前を結合して正確なパスを作成し、ファイルであればリストに追加する という処理をします。
step
5forループの繰り返し処理で、フォルダ内の各ファイルに対して以下の処理を行う:
画像ファイルかどうかをチェックしています(拡張子が.png、.jpg、.jpeg、.gif、.bmpのいずれか)。
画像をワード文書に追加しています(doc.add_picture(os.path.join(image_folder, file_name)))。
ファイル名を文書に記載しています(doc.add_paragraph(file_name))。
step
6ワード文書を保存する:
最後に、doc.save('output.docx')で、作成したワード文書をファイルとして保存しています。
画像点数にもよりますが、Wordの生成には1秒もかかりません。
生成されたWordを印刷して、実際に画像が原寸で貼付けられ、ファイル名も表示されているか確認してみます。
原稿(一例)
成果物(一例)
無事に指定通りのものがWordで生成されて、校正のチェックに回すことができました。
まとめ
Copilotによって生成されたPythonコードを実行すると、画像フォルダ内のすべての画像がWord文書に原寸で貼り付けられ、各画像の下にファイル名も表示されました。
PDFから画像を切り出すというお仕事自体は過去にもありましたが、画像の大きさとファイル名を社内の校正でチェックするということは初めてでした。そのため前回との比較はできませんが、想像するに手貼りと自動化を比べたら、相当な時短・効率化が図れたのではないかと思います。
今回、深津式プロンプトを用いてCopilotに投げてみましたが、ここ最近のAIの進歩は目覚ましく、そのうちにこのようなプロンプトの形式にこだわらずに投げかけても、期待に即した結果を返してくれる日がくるのではないかと思います。
生成AIが乱立する昨今ですが、日頃からAIの情報をキャッチアップし、普段の業務の中で、この生成AIを使ったら、この業務に活用できるのではないか等々・・・、常に意識していくことが大切かと思います。