AppleScript で docx ファイルを pdf に自動変換する2024/06/07(金)
本学では、講義用の教材の配布や、レポートの提出のために、WebClass というシステムを使っています。このシステムは、だいぶ以前から導入されていたのですが、コロナ禍を機会に本格的に活用されるようになりました。レポートの採点・集計機能なども備えています。ただ、あまり機動性の高いシステムではなく、対話的な作業をするには力不足の感が強いので、私はもっぱら学生との間のファイル交換ツールとして使っています。
WebClass にレポートを提出してもらう時、「docx または pdf」を指定することがよくあります。オムニバス科目のレポート課題などで、あまりガチな内容ではないときは、手書きをスキャンして PDF 化する方が書きやすい場合もあるためです。そうすると、受け取ったファイルのリストはこんな様子になります。
これを採点するのは、なかなかに面倒な作業なのですね。紙のレポートだったら、学籍番号順に並べ替えて揃え、上から1枚ずつめくって点数をつけていけばよいのですが、100個近いファイルを PC 上で順番に開いて採点するのは、かなり大変です。マウスでファイルをダブルクリックして、開いたファイルを先頭から読む、という作業は、右手と視線の移動がいちいち大きく、そのたびに少しずつ集中力が削がれることになります。
そこで、docx ファイルを全部 PDF に変換して、かつ学籍番号順に並べ替えておいて、Digital Paper で採点することにしました。Digital Paper での採点は、自分のスタイルとして完全に確立していて、紙のレポートとさほど変わらない感覚で進めることができています。ファイル形式とファイル名だけなんとかすればよいのです。
そうなると、スクリプト言語の出番です。「docx ファイルを PDF に変換」というのが鬼門だなと思ったのですが、"AppleScript docx pdf" で検索すると、すぐに見つかりました:AppleScript - Save Microsoft Word DOC(X) Document to PDF。AppleScript 関連の情報は探しにくくて、いつも難儀します。Microsoft Word の AppleScript でこんなことができるなんて知らんかったよ。
というわけで、下のような bash スクリプトを書きました。WebClass で一括ダウンロードしたファイルは、"整理番号_学籍番号_ファイル名.拡張子"という形式になっています。最初の"整理番号_"という部分を削除すれば、学籍番号がファイル名の先頭に来ます。AppleScript の部分は、osascript
コマンドと、bash のヒアドキュメントを使って記述します。
#!/bin/bash
# docx を MSWord を使って pdf に変換
# ついでに、WebClass 特有の "ddd_" という接頭辞を削除する
for i in *.pdf
do
ipdf=${i#[0123456789][0123456789][0123456789]_}
if [ "$ipdf" != "$i" ]; then
mv "$i" "$ipdf"
echo "Rename: " "$i" "->" "$ipdf"
fi
done
for i in *.docx
do
rp=`realpath "$i"`
ipdf=${i%.docx}.pdf
ipdf=${ipdf#[0123456789][0123456789][0123456789]_}
rpdf=`realpath "$ipdf"`
echo "Make PDF: " "$i" "->" "$ipdf"
osascript <<EOF
tell application id "com.microsoft.Word"
activate
set view type of view of active window to draft view
open ("$rp" as POSIX file)
set outputPath to ("$rpdf" as POSIX file)
repeat while not (active document is not missing value)
delay 0.5
end repeat
set activeDoc to active document
save as activeDoc file name outputPath file format format PDF
close active document saving no
end tell
EOF
done
無事、学籍番号順の PDF になりました。