どうも、ABCanG(阿部)です。
今年は入部届自動生成ツールを作った話をしようかと思います。

RCCでは入部届は紙に名前とか電話番号を書いたもので管理してました。
紙での管理って面倒ですよね。検索とかやりにくいですし。
なので、いつも提出された紙を見てエクセルのシートにまとめるといった作業をしていました。

手動で紙のデータを入力するのは非常に面倒です。
文字が分からなかったり、入力ミスをしたりと、いいことはありません。
ということで、Googleフォームを使ってそれらの情報を入力してもらうことにしました。
しかしながら、入部届は自筆で記名して貰う必要があります。
なので、入力されたデータから入部届を自動生成するツールを作って、それで印刷された紙に名前を書いてもらうことにしました。

作ったツールの機能

csvを読み込んで個人個人の入部届をpdfで生成します。
最終的に下の画像のようなpdfが生成されます。

立命太郎

使ったモノ

  • shell script
  • latex

コードとか

#!/bin/bash

LIST=./list.csv

if [ ! -f ${LIST} ]; then
    echo "${LIST} no such file or directory"
    exit 1
fi

year="`date '+%Y'`"
mkdir -p ./out

grep -v \^[#,] ${LIST} | while read line
                         do
                             line="`echo ${line} | sed -e 's/_/\\\\\\\\_/g'`"
                             num="`echo ${line} | cut -d "," -f2`"
                             first_name="`echo ${line} | cut -d "," -f3`"
                             last_name="`echo ${line} | cut -d "," -f4`"
                             first_kana="`echo ${line} | cut -d "," -f5`"
                             last_kana="`echo ${line} | cut -d "," -f6`"
                             rcc_name="`echo ${line} | cut -d "," -f7`"
                             rainbow="`echo ${line} | cut -d "," -f8`"
                             kaisei="`echo ${line} | cut -d "," -f9`"
                             gakubu="`echo ${line} | cut -d "," -f10`"
                             gakka="`echo ${line} | cut -d "," -f11`"
                             tel="`echo ${line} | cut -d "," -f12`"
                             mail="`echo ${line} | cut -d "," -f13`"

                             if [ -e ./out/${kaisei}/${first_name}${last_name}.pdf ]; then
                                 echo "${first_name}${last_name} already exist."
                                 continue
                             fi

                             cat ./src/document_base.tex \
                                 | sed -e "s/#\[year\]/${year}/g" \
                                 | sed -e "s/#\[num\]/${num}/g" \
                                 | sed -e "s/#\[first_name\]/${first_name}/g" \
                                 | sed -e "s/#\[last_name\]/${last_name}/g" \
                                 | sed -e "s/#\[first_kana\]/${first_kana}/g" \
                                 | sed -e "s/#\[last_kana\]/${last_kana}/g" \
                                 | sed -e "s/#\[rcc_name\]/${rcc_name}/g" \
                                 | sed -e "s/#\[rainbow\]/${rainbow}/g" \
                                 | sed -e "s/#\[kaisei\]/${kaisei}/g" \
                                 | sed -e "s/#\[gakubu\]/${gakubu}/g" \
                                 | sed -e "s/#\[gakka\]/${gakka}/g" \
                                 | sed -e "s/#\[tel\]/${tel}/g" \
                                 | sed -e "s/#\[mail\]/${mail}/g" \
                                       > ./src/document.tex

                             cd ./src
                             make > /dev/null
                             cd ..
                             mkdir -p ./out/${kaisei}
                             mv ./src/build/document.pdf ./out/${kaisei}/${first_name}${last_name}.pdf
                             echo "Making ${first_name} ${last_name} succeeded."
                         done

exit 0
#タイムスタンプ,学籍番号,苗字(漢字),名前(漢字),苗字(ふりがな),名前(ふりがな),RCCアカウント,RAINBOW ID,回生,学部,学科,電話番号,メールアドレス(学内以外)
2015/03/27 18:43:29,2600150123-4,立命,太郎,りつめい,たろう,ritstaro,is01234vh,1回生,情報理工学部,,080-1234-5678,master@rcc.ritsumei.ac.jp
\documentclass[12pt,a4paper]{jsarticle}
\usepackage{graphicx}

\title{\begin{figure}[htbp]
    \begin{center}
      \includegraphics[width=12cm]{rcc_logo_vector.eps}
    \end{center}
  \end{figure}
  入部届}
\author{立命館コンピュータクラブに入部を希望します.}
\date{#[year]年\_\_月\_\_日}

\begin{document}
\maketitle
\thispagestyle{empty}

\section*{名前: #[first_name] #[last_name](#[first_kana] #[last_kana])}
\section*{回生: #[kaisei]}
\section*{学生証番号: #[num]}
\section*{学部学科: #[gakubu] #[gakka]}
\section*{学内アドレス: #[rainbow]@ed.ritsumei.ac.jp}
\section*{RCCアカウント: #[rcc_name]}
\section*{電話番号: #[tel]}
\section*{メールアドレス: #[mail]}
\section*{署名: }
\begin{flushright}受理:#[year]年\_\_月\_\_日\end{flushright}

\end{document}

処理の流れ

  1. list.csvを読み込む
  2. データを1行読み込んで、読み込めなくなれば終了
  3. csvのデータを各変数に代入
  4. 既にファイルが存在しないかチェックして、存在していたら2に戻る
  5. 存在しなければベースのtexファイルを文字列置換してtexファイルを生成
  6. latexでpdfを生成
  7. 2に戻る

問題点

  • Googleスプレッドシートから手動でcsvをダウンロードして配置しなければならない
  • これはダウンロードしてくるようにすれば良さそう
  • shell scriptで頑張ってるから、コードがスマートではない
  • csvの解析スマートではない
  • #[hoge] で文字列置換してて結構無理やりだし、テンプレートエンジン使いたい
  • rubyとかnode.jsあたりがよさそう?
  • latexの環境依存やばそう
  • 気軽に導入できない
  • 表示できない漢字(旧書体)がたまにある
  • rubyとかnode.jsのpdf生成するパッケージ使ったほうが良さそう
  • 生成されたpdfを探しにくい
  • 名前.pdf という形で出力されるため、日本語のソート順を理解していないと探すのに苦労する
  • どう考えても英字のファイル名で出力するべき
  • 印刷が手動
  • 新しく生成されたpdfは印刷コマンド叩くようにしたい

感想
面倒は減ったのかというところですが、このツールを作る前よりはだいぶ楽になりました。
数時間クオリティなので、問題点がたくさん残ってますが、入部届っぽい紙を生成できたかなーと思います。
春までにはrubyとかnode.jsを使って、問題点を解決した新しい入部届自動生成ツールを作りたいと思ってます。


 

次の記事はたかひーさんのsiv3Dを触ってみたです。

Twitterでフォローしよう

おすすめの記事