WSL::発表会資料集作成要領・ツールmkbook
#2025/3/27
 本ツールはmanabaに提出された報告書をまとめ,プログラム発表順に並べ,資料集としてまとめる.
手作業でやっていたことをスクリプトとしてまとめた.
◆特徴
3年生の専門基礎研究,4年生の特別研究,修士の修士論文公聴会に対応
設定ファイル mkbook.cf の数項目を設定するのみ
必要なファイルのチェックと,作成に必要なステップを自動で進む
途中からの作成や部分作成のために,ステップ個別の実行も可能
PDFのマージ,頁数カウント,ノンブルの追加,栞の挿入をすべてUnix コマンドでカバー
WSL Ubuntu ならファイルシステムを共有しての作業が可能
◆必要な環境・ツール
◎環境:Windows11 + WSL Ubuntu上でbashスクリプトを作成して一括処理する
※前のバージョンでは一部Windowsツールを利用していたが,すべて一Ubuntuで括処理可能になった
MacOSでは試していないが.以下のツールのインストールとディレクトリが正しければ正常稼働すると思われる.
◎Unix ツール:
pdftk:Ubuntu:PDFを連結/分割:要インストール
【PDFtk】LinuxでPDFを結合する|めかとろな日々
pdfinfo:Ubuntu:PDFファイルの情報取得:要インストール
【 pdfinfo 】コマンド――PDFファイルの情報を表示する:Linux基本コマンドTips(282) - @IT
python3:addpnum を実行する:要インストール
addpnum.py:ノンブル付加用にPythonで自作.必要なモジュールは以下の通り
reportlab, pdfrw :要インストール
sys, os, argparse, subprocess :デフォルトモジュール
gs(ghostscript) :しおりを付加する:要インストール
◎Windowsツール:すべてUnix CLIで可能なので,ツールは特に不要.あえて挙げれば以下のとおり.
Excel:csvファイル,表紙,中扉を作成
PowerPoint:白紙,色背景紙を作成
pdfas:Windows:PDFマージ,フッタ付与に利用していた.今は不要
FoxIt PDF:Windows:中扉に「しおり」を付加するのに利用していた.今は不要
CubePDF Utility:Windows:多すぎる白紙の削除,部分差し替え等に便利
◆条件・全体の流れ
◎目的: manabaで一括ダウンロードできる各科目の報告書から資料集を作成する.
★修士論文要旨の場合は,全体PDFから専攻分を抜き出し,個別PDFに分離する作業あり(手作業)
◎ゴールイメージ
資料集は以下のファイルを統合して作成する.専セミ,特発,修公ともに同じ.
資料集 = 表紙 + 白紙 + グループ{中扉(色付き) + 本体 + △白紙} ← 栞を追加
◆事前準備
以下は,mkbook を実行すれば順に指摘されるが,最初から揃えておくべき
1. distへのコピー用の csv ファイルを作成する.
発表プログラムExcelから,以下のような 5つのフィールドを作成
A,01,Y210214,宇田 圭佑,吉井
2. src 用ディレクトリを作成 → mkbok.cf で srcdir に設定
3. srcdirにmanabaからダウンロードした報告書ファイルのうち,資料集にいれるものをコピーする
専セミ:報告書本体
特発・修公:要旨
★修士論文要旨は別途手作業が必要.
全体の要旨集が学部からリリースされる
ここから専攻分を抜き出し,個別PDFに分離する
各ファイルを学番_氏名.pdf に変名し,srcdir に格納
4. dist 用ディレクトリを作成 → mkbook.cfで distdir に設定
distdirにはマージ用に名前変更後の報告書ファイルを収容する
なので,ディレクトリ内は空でよい
5. 表紙,中扉を作成する. → hyosifile と tobirafile に設定
推奨は $year$title と同じにしておく方がよかろう
例:y24特発表紙.pdf
プログラムExcel内で夫々作成 → PDF
6. 白紙ファイルを用意する.
本体両面印刷時,次の中扉が見開き右側(奇数頁)にするため.
表紙,中扉,本体が奇数頁の場合に付加するA4の白紙.PowerPointかWordで作成 → PDF
7. 色付き背景ファイルを用意する. → colbgbody として ファイル名を指定
デフォルト:colbgbody="Colordummy"
PowerPointかWordで作成 → PDFに
中扉を目立たせるため,色背景をつける.
例:専セミは薄青(Blue),特発セミは薄緑(Green),修公は紫(Purple)
それぞれ,Colordummy_Blue.pdf, Colordummy_Green.pdf, Colordummy_Purple.pdf
※ mkbook.cf の中で色名の設定変更は可能
6. mkbook.cf を適切に設定する
★mkbook.cfさえ設定しておけば,上記ファイルが揃っていなくても,mkbookは実行できる.
◆mkbook.cf 設定
※mkbook.cf全体は後に添付
mkbook.cfで確認・指定しておく項目は以下の通り.
code:mkbook.cfでの指定
# 発表会年度:bookファイル名の頭になる
year="y24"
# 発表会種類:1=専セミ,2=特発,3=修公
hapnum=3
# dist ディレクトリ
distdir="./dist"
# 表表紙ファイル:空だとdefaultは: $year$title表紙.pdf
## 特段の指定なければ空で
hyosifile=""
# 中扉ファイル:空だとdefaultは: $year$title中扉.pdf
## 特段の指定なければ空で
tobirafile=""
# 白紙ファイル
whitepdf="Whitedummy.pdf"
# 中扉背景用色付きファイル名の頭:これに色名がつく
colbgbody="Colordummy"
◆実行
./mkbook で実行する.
code:mkbook実行例
$./mkbook
## Main titlle= y24修公
## Firstly checking files...Done. status=0 0 0 0 1 1 0 0 0 0 0 0
## Input Menu No.(Ret=All, 80=list, 99=quit):
※statusは各ファイルの状態を示す.詳細は mkbook 内を参照
◎プロンプトが出るので,なにも入力せずにEnterを押す.
→ ファイル確認とステップを最初から最後まで実行する.
→ 不足ファイル等があれば作成確認または Stopする.
→ Stopしたら,必要なファィルを用意してから Enter=自動実行する.
→ これを繰り返すことで,Step12まで完成させることができる.
※多くの場合はこれでOK
◎部分的にステップを実行したい場合はステップの番号1--12を入力
◎"60"以降は個別用途.
"60":ファイルチェックしてstatus確認
"70":mkbook内の関数を指定実行
"80":ステップリストを表示(help)
"90":book ファイルのサマリ情報
"99":mkbookを 終了
◆ステップ処理解説
以下,mkbook の自動実行でのステップを説明する.
1. 命名用csv
manabaの学番順ファイルを並べ替えるためのデータ:例:y24特発work.csv
★なければStop → プログラムExcelから発表者の組と順番のcsvを生成 → csvファイル
例: A,01,Y210214,宇田 圭佑,吉井
excelから生成 → csv保存 → 空行,余分なカンマを削除
2. srcディレクトリとdestディレクトリ
srrcdir:manabaからの報告書ファイルをいれる
★なければStop → 手でmkdir し,必要な報告書ファイルをコピーしておく
distdir:組―発表順に変名したファイルをいれる
★なければStop → 手でmkdir する.中身は空
3. 表紙
表紙用PDF:例:y24特発表紙.pdf
★なければStop → プログラムExcelファイルから作成
4. 白紙:A4縦の白紙を作成 → PDF
両面印刷時,中扉が必ず見開き右にくるように適宜挿入するための白紙
★なければStop → PowerPointで作成
5. 背景色紙
中扉を目立たせるため,科目別に色を決め,背景色にする.
そのためのA4縦の色紙 → PDF
例:専セミは薄青(Blue),特発セミは薄緑(Green),修公は紫(Purple)
それぞれ,Colordummy_Blue.pdf, Colordummy_Green.pdf, Colordummy_Purple.pdf
★なければStop → PowerPointで作成
6. 中扉の元ファイル
組別の扉ファイル:例:y24特発中扉.pdf
★なければStop → プログラムExcelから組別中扉を作成
7. 中扉:色付
6.の中扉ファイルを5. の背景で色付けしたもの
★なければこの Step で生成
8. 中扉:組別
色付き中扉ファイルを組別単頁にバラしたもの
★なければこの Step で生成
9. 本体:組別併合
組別のマージ済報告書ファイル:例:y24特発本体_A.pdf
★なければこの Step で生成
組別報告書の頁数をカウントする
報告書を組別にマージする
組別本体にカウントした頁ノンブルを印字
組別に,中扉 + 白紙 + 本体 + 必要なら白紙 をマージ
10. 全部:統合済
表紙と組別本体をマージした統合ファイル:例:y24特発資料集All.pdf
★なければこの Step で生成
表紙 + 白紙 + 組別本体ファイル
11. しおり用info
統合ファイルに付加するしおりの情報ファイル:例:y24特発資料集All.info
★なければこの Step で生成
中身は gs の仕様.以下に例示
code:infoの例
[/Page 1 /Title (Top) /OUT pdfmark
[/Page 3 /Title (Group_A) /OUT pdfmark
[/Page 15 /Title (Group_B) /OUT pdfmark
12. しおりを付加する
統合ファイルにしおりがすでに付加されているかを判定
★なければ ,infoファイルを元に,統合ファイルにしおりを付加する
◆設定ファイル: mkbook.cf
設定ファイルmkbook.cfを示しておく.
※実行シェルに注意※
mkbookスクリプトは source コマンドでこの mkbook.cf を読み込んでいる.
ところが, /bin/shのリンク元である 'dash' というシェルは sourceコマンドを含まないので cf を読み込めない.なので,mkbook では呼び出しシェルを /bin/bash にしている.Linuxのディストロによって異なる場合があるので注意されたし.
※どうしても /bin/sh を使いたい場合は,'source' の代わりに '.' コマンドを使うらしい.
◎スクリプト設定ファイル
code:mkbook.cf
# 資料集作成スクリプト用設定
#
## mkbook前準備 ##
## 1. distへのコピー用の csv ファイルを作成する.発表プログラムExcelから,以下のような 5つのフィールドを作成
## A,01,Y210214,宇田 圭佑,吉井
## 2. src ディレクトリを作成 → srcdir に設定.
## 3. srcdirにmanabaからダウンロードした報告書ファイルのうち,資料集にいれるものをコピーする
## 専セミ:報告書本体
## 特発・修公:要旨
## 4. dist ディレクトリを作成 → distdir に設定
## distdirは,マージ用に名前変更後の報告書ファイルを収容する
## なので,最初はディレクトリ内は空
## 5. 表紙,中扉を作成 → PDF
## 6. 白紙ファイルを用意 → whitepdf に設定
## 本体両面印刷時,次の中扉が見開き右側(奇数頁)にするため.
## 表紙/中扉/本体が奇数頁の場合に付加するA4の白紙.PowerPointかWordで作成 → PDF
## 7. 色付き背景ファイルを用意する. → colbgbody として ファイル名を指定
## デフォルト:colbgbody="Colordummy"
## 8. 本設定ファイル(mkbook.cf)に必要な情報を設定する
## 9. 以上が済んだらこのファイルを閉じて, ./mkbook を実行
##
## mkbook.cfさえ設定しておけば,上記ファイルがなくてもmkbookは実行できる.
## mkbook のコマンドプロンプトで入力なしEnterすれば,ファイル確認とステップを最初から最後まで実行する.
## 不足ファイル等があれば促してStopする.
## Stopしたら,必要なファィルを用意してから Enter=自動実行する.
## これを繰り返すことで,Step12まで完成させることができる.
## 部分的にステップを実行したい場合は "80" でリストを表示し,ステップの番号1--12を入力
## "99" でmkbook 終了
#
####################
#### 設定が必須な変数
####################
# 発表会年度:bookファイル名の頭になる
year="y24"
# 発表会種類:1=専セミ,2=特発,3=修公
hapnum=3
# dist ディレクトリ
distdir="./dist"
# 表表紙ファイル:空だとdefaultは: $year$title表紙.pdf
## 特段の指定なければ空で
hyosifile=""
# 中扉ファイル:空だとdefaultは: $year$title中扉.pdf
## 特段の指定なければ空で
tobirafile=""
# 白紙ファイル
whitepdf="Whitedummy.pdf"
# 中扉背景用色付きファイル名の頭:これに色名がつく
colbgbody="Colordummy"
####################
## 以下は半自動設定.必要に応じて書き換える
####################
case ${hapnum} in
"1")
title="専セミ"
# 中扉の背景色
color="Blue"
# 報告書/要旨ファイル用ディレクトリ
srcdir="./src.Sen"
# 組数:ABCD
garry=(A B C D)
;;
"2")
title="特発"
color="Green"
srcdir="./src.Tok"
# 組数:ABC
garry=(A B C)
;;
"3")
title="修公"
color="Purple"
srcdir="./src.Syu"
# 組数:AB
garry=(A B)
# 1日だけの場合
#garry=(A);;
;;
esac
########################
#### 以下は自動設定
########################
# 組数
groupnum=${#garry@}
# 色付き中扉ファイル
tobiracolorbody="${tobirabody}_Col"
# 組別中身統合ファイル
mergebody="${year}${title}本体"
# 表表紙ファイル(拡張子以外):y24特発表紙
if -z "$hyosifile" ; then
hyosibody="${year}${title}表紙"
else
hyosibody="${hyosifile%.*}"
fi
# 中扉ファイル(拡張子以外):y24特発中扉
if -z "$tobirafile" ; then
tobirabody="${year}${title}中扉"
else
tobirabody="${tobirafile%.*}"
fi
# 中扉背景用色付きファイル:専セミは薄青,特発セミは薄緑,修公は紫
colorpdf="${colbgbody}_${color}.pdf"
# 報告書ファイルの命名用csvファイル
namefile="${year}${title}work.csv"
bookpdf="${year}${title}資料集All.pdf"
◆mkbook スクリプト
以下に提示する.
code:mkbook
#!/bin/bash
##### manabaの報告書から発表プログラム順の資料集を作成する
## まず mkbook.cf 等の準備が必要
## 詳細説明は mkbook.cf を読むこと
#########
## 設定ファイルを読み込む
conf="mkbook.cf"
if ! -e $conf ; then
echo "No $conf ."
exit -1
else
source $conf
fi
## 定数: mkbook.cf での定義からの読み替え
# 詳細は mkbook.cf 参照
sdir=$srcdir # manabaからの報告書をいれる
ddir=$distdir # プログラム順に変名した報告書をいれる
book=$bookpdf # 出来上がりの資料集
bmkfile="${book%.*}.info" # 栞情報ファイル
namecsv=$namefile # 報告書ファイル命名用csv
wfile=$whitepdf # A4白紙ファイル
hyosi="${hyosibody}.pdf" #資料集表紙
tbody=$tobirabody
tfile="${tbody}.pdf" # 中扉ファイル
tcolbody=$tobiracolorbody
tcolfile="${tcolbody}.pdf" # 中扉色付きファイル
bgfile=$colorpdf # 中扉背景色ファイル
mbody=$mergebody # 本文併合ファイル名
addpnum="addpnum.py" # ノンブル付加用スクリプト
# 変数初期値
stage=0 # ステージ番号
dummy=$wfile # 白紙にする/しない,の作業で使う
# 各種ファイル等チェック用ステータス配列
status=(0 0 0 0 0 0 0 0 0 0 0 0)
# ステージ番号表示用
cklbl=(" 0:すべてStage1~Stage13")
cklbl+=(" 1:命名用csv") #status=0
cklbl+=(" 2:sdirとddir") #status=1,2
cklbl+=(" 3:表紙") #status=3
cklbl+=(" 4:白紙") #status=4
cklbl+=(" 5:色背景") #status=5
cklbl+=(" 6:中扉:元") #status=6
cklbl+=(" 7:中扉:色付") #status=7
cklbl+=(" 8:中扉:組別") #status=8
cklbl+=(" 9:本体:組別併合") #status=9
cklbl+=("10:全部:統合済") #status=10
cklbl+=("11:栞用info") #status=11
cklbl+=("12:栞追加")
cklbl+=("60:FileCheck実行")
cklbl+=("70:関数指定実行")
cklbl+=("80:メニューリスト")
cklbl+=("90:$book サマリ")
cklbl+=("99:quit")
# 既存ファイルをチェックしてstatusにいれる
function FileCheck() {
# echo " (${FUNCNAME0})"
# status 初期化
status=(0 0 0 0 0 0 0 0 0 0 0 0)
# 0:命名用csvファイル
if -e $namecsv ; then
status0=1
fi
# 1:sdirにファイル
ls $sdir/* &> /dev/null
stt=$?
if $stt -eq "0" ; then
status1=1
fi
# 2:ddir適切ファイル
ls $ddir/A-D_*.pdf &> /dev/null
stt=$?
if $stt -eq "0" ; then
status2=1
fi
# 3:表紙ファイル
if -e $hyosi ; then
status3=1
fi
# 4:白紙ファイル
if -e $wfile ; then
status4=1
fi
# 5:色背景ファイル
if -e $bgfile ; then
status5=1
fi
# 6:中扉元ファイル
if -e $tbody.pdf ; then
status6=1
fi
# 7:色付中扉ファイル
if -e ${tcolbody}.pdf ; then
status7=1
fi
# 8:色付中扉組別ファイル
ls ${tcolbody}_A-D.pdf &> /dev/null
stt=$?
if $stt -eq "0" ; then
status8=1
fi
# 9:組別併合ファイル
ls ${mbody}_A-D.pdf &> /dev/null
stt=$?
if $stt -eq "0" ; then
status9=1
fi
# 10:全部マージ済ファイル
if -e $book ; then
status10=1
fi
# 11:ブックマークファイル
if -e $bmkfile ; then
status11=1
fi
return 0
}
## マージのために報告書ファイルを変名して ddir にコピーする
function RenRepFiles(){
# echo " (${FUNCNAME0})"
namecsv=$namefile # 報告書ファイル命名用csv
sed -e 's/ //' $namecsv |nkf -Lu \
| gawk -v ddir=${ddir} -v sdir=${sdir} -F ',' \
'{
fname=sprintf("%s_%s_%s_%s_%s.pdf",$1,$2,$3,$4,$5)
command=sprintf("cp %s/*%s* %s/%s",sdir,$3,ddir,fname)
system(command)
close(command)
}'
return 0
}
## 中扉の背景を色付きにする
function AddColTobira(){
# echo " (${FUNCNAME0})"
pdftk $tfile background $bgfile output $tcolfile
return 0
}
## 単頁にバラす
function SepColFile(){
# echo " (${FUNCNAME0})"
# Seperate $tcolfile to 01.pdf, 02.pdf...
pdftk $tcolfile burst output %02d.pdf
# ファイル名を$mbody_$i に変更
for ((i=0 ; i < ${#garry*}; i++)); do
tbr_grp_pdf="${tobiracolorbody}_${garry$i}.pdf"
numfile=printf %02d.pdf $(($i+1))
mv $numfile $tbr_grp_pdf
done
return 0
}
# 組別要旨集の頁数を数える
function CountPage() {
# echo " (${FUNCNAME0})"
pagearry=""
for c in ${garry*} ; do
pnumfile="./${tcolbody}_${c}_pages.dat"
pages=0
for j in $ddir/${c}_* ; do
ptmp=pdfinfo ${j}|grep Pages| awk '{print $2}'
let pages+=$ptmp
done
echo "$pages" > $pnumfile
pagearry+="$c=$pages "
done
return 0
}
# 組別に報告書/要旨をマージ >ノンブル付加 >白紙入れ判別 >扉と統合
function MergeGroup() {
# echo " (${FUNCNAME0})"
sttpg=1
for i in ${garry*} ; do
tobfile="./${tcolbody}_${i}.pdf"
srcfile="$ddir/${i}_*.pdf"
mrgfile="./${mbody}_${i}.pdf"
mrgwork="./${mbody}_${i}_work.pdf"
pnumfile="./${tcolbody}_${i}_pages.dat"
pages=cat $pnumfile
#
# まず中身だけマージする
echo -n " Group ${i}: Merging contents only.."
pdftk $srcfile cat output $mrgwork
echo "Done."
# これらにノンブルを付加する
# 修公ではノンブルなしなのでパスする
if $hapnum -ne 3 ; then
echo -n " Group ${i}: Add pagenum to $mrgwork"
addpagenum ${i} ${sttpg}
sttpg=$?
echo "Done. nextsttpg=$sttpg"
fi
#read -p "C-c to Stop:"
# 白紙の付加判断:偶数なら白紙変数を空に/奇数なら白紙を追加
echo -n " Group ${i}: Merging Tobira + contents -> $mrgfile ... "
if $(($pages % 2)) -eq 0 ; then
dummy=""
else
dummy=$wfile
fi
# 扉ファイルと中身とdummyをマージする
# 扉ファイルの次頁に必ず白紙をいれる
pdftk $tobfile $wfile $mrgwork $dummy cat output $mrgfile
echo " Done."
done
# orgファイルは判定に必要なので残す
rm -f ${mbody}_*_work.pdf
return 0
}
# addpnum.py で ノンブルを打つ!
function addpagenum(){
# echo " (${FUNCNAME0})"
# echo " Add page numbers by $addpnum ..."
# 引数定義
i=${1}
sttpg=${2}
# 変数定義
tobfile="./${tcolbody}_${i}.pdf"
srcfile="$ddir/${i}_*.pdf"
mrgfile="./${mbody}_${i}.pdf"
mrgwork="./${mbody}_${i}_work.pdf"
numfile="./${tcolbody}_${i}_pages.dat"
pages=cat $numfile
# 打刻開始は1から,ページ番号は組別に sttpg に加算
python3 $addpnum -n $sttpg $mrgwork
let sttpg+=$pages
return $sttpg
}
#表紙と中身を一つにマージ
function Merge2Book() {
# echo " (${FUNCNAME0})"
# book あればbakファイルにコピーする
fname=""
for i in ${garry*}; do
fnames+="${mbody}_${i}.pdf " #最後に空白いれる!
done
pdftk $hyosi $wfile ${fnames*} cat output $book
return 0
}
# make bookmarkfile
function MkBmFile() {
# echo " (${FUNCNAME0})"
# create info file"
mark_p='/Page'
mark_t='/Title'
mark_o='/OUT pdfmark'
# initial
sttpg=1
marktitle="Top"
mark="[${mark_p} ${sttpg} ${mark_t} (${marktitle}) ${mark_o}"
echo $mark > $bmkfile
# next
sttpg=3
for i in ${garry*} ; do
# save last $mark text to $bmkfile
# new group title
marktitle="Group_$i"
mark="[${mark_p} ${sttpg} ${mark_t} (${marktitle}) ${mark_o}"
echo $mark >> $bmkfile
#
mrgfile="./${mbody}_${i}.pdf"
# new page num
ptmp=pdfinfo ${mrgfile}|grep Pages| awk '{print $2}'
let sttpg+=$ptmp
# echo "Group $i: marktitle=$marktitle , ptmp=$ptmp , sttpg=$sttpg"
done
return 0
}
#gsを使ってbookmarkを付与する
function AddBookMark() {
# echo " (${FUNCNAME0})"
if ! -e $bmkfile ; then
echo " OOps... No $bmkfile. Che it now."
return 1
fi
workfile="${book%.*}.work"
mv ${book} ${workfile}
# exec gs process
gs -sDEVICE=pdfwrite -q -dBATCH -dNOPAUSE -sOutputFile=$book -dPDFSETTINGS=/prepress $bmkfile -f $workfile
}
###
### 以下,ステージ関数:もっと合理化できないか……?
###
# 1:命名用csvファイルがないのはダメ
function Stage1(){
stage=1
echo -n "# $stage# Cheking $namecsv..."
if [ ${status$(($stage-1))} -eq "0" ]; then
echo " No $namecsv. Create from Excel."
echo " Canceled."
return 1
else
echo "Stage $stage OK."
return 0
fi
}
# 2:ddirにブツがない → 02-mknum にもどれ
function Stage2(){
stage=2
echo -n "# $stage# Cheking $ddir ..."
if [ ${status$(($stage-1))} -eq "0" ]; then
echo " $sdir has no file."
echo " Check it now."
return 1
elif [ ${status$stage} -eq "0" ]; then
echo " $ddir has no good files."
read -p " Rename and copy report to $ddir? y/n:" input
if $input == "y" ; then
echo -n " Copying reports to $ddir in new ruled name..."
RenRepFiles
echo " Copy Done. Check $ddir by yourself."
return 0
else
echo " Canceled."
return 1
fi
else
echo "Stage $stage OK."
return 0
fi
}
# 3:表紙ファイルないのはやりなおし
function Stage3(){
stage=3
echo -n "# $stage# Checking 表紙 file..."
if [ ${status$stage} -eq "0" ]; then
echo "No 表紙 file. Chcek it now."
echo " Canceled."
return 1
else
echo "Stage $stage OK."
return 0
fi
}
# 4:白紙ファイルないからやりなおせ
function Stage4(){
stage=4
echo -n "# $stage# Checking $wfile file..."
if [ ${status$stage} -eq "0" ]; then
echo "No $wfile. Check it now."
echo " Canceled."
return 1
else
echo "Stage $stage OK."
return 0
fi
}
# 5:色背景ファイルがないのもやりなおし
function Stage5(){
stage=5
echo -n "# $stage# Checking $bgfile ..."
if [ ${status$stage} -eq "0" ]; then
echo "No $bgfile. Check it now."
echo " Canceled."
return 1
else
echo "Stage $stage OK."
return 0
fi
}
# 6:中扉元ファイルなかったらStop
function Stage6(){
stage=6
echo -n "# $stage# Checking $tfile ..."
if [ ${status$stage} -eq "0" ]; then
echo " No $tfile. Check it now."
echo " Canceled."
return 1
else
echo "Stage $stage OK."
return 0
fi
}
###ここから細かくチェック
# 7:色付中扉ファイル: 下に含まれるのでパス
function Stage7(){
stage=7
echo -n "# $stage# Cheking 色付中扉(単独) file..."
if [ ${status$stage} -eq "0" ]; then
echo " No 色付中扉(単独) file."
read -p " Make Col Tobira now? y/n:" input
if $input == "y" ; then
echo -n " Add background color to tobira..."
AddColTobira
echo "Done."
return 0
else
echo " Canceled."
return 1
fi
else
echo "Stage $stage OK."
return 0
fi
}
# 8:組別色扉 Col_ABCがないけど?01-mktobiraに戻る?
function Stage8(){
stage=8
echo -n "# $stage# Cheking 組別色扉 files..."
if [ ${status$stage} -eq "0" ]; then
echo " No 組別色扉 files."
echo -n " Seperate each tobira page ..."
SepColFile
echo "Done."
return 0
else
echo " Stage $stage OK."
return 0
fi
}
#9:組別合併ファイル tbody_ABC.pdf ないから作る?
function Stage9(){
stage=9
echo -n "# $stage# Cheking 組別合併(no 頁) files..."
if [ ${status$stage} -eq "0" ]; then
echo "No 組別合併 files."
if ! -e "*_pages.dat" ; then
echo -n " Counting page numbers..."
CountPage
echo -n " ${pagearry*}"
echo " Done."
fi
echo " Merging contents..."
MergeGroup
echo " Done.Check every marged files."
return 0
else
echo "Stage $stage OK."
return 0
fi
}
# 11:book あるけどどうする?
function Stage10(){
stage=10
echo -n "#$stage# Cheking $book file..."
if [ ${status$stage} -eq "0" ]; then
echo "No $book."
echo -n " Merge all files to $book ... "
Merge2Book
echo " Done."
echo " Check $book by yourself."
else
echo " Stage $stage OK."
fi
return 0
}
#12:ブックマークinfoファイルがなければ作る
function Stage11(){
stage=11
echo -n "#$stage# Cheking $bmkfile..."
if [ ${status$stage} -eq "0" ]; then
echo " No $bmkfile."
echo -n " Create info file $bmkfile ..."
MkBmFile
echo " Done."
else
echo " Stage $stage OK."
fi
return 0
}
#13:book にブックマークを追加する
function Stage12(){
stage=12
echo "#$stage# Cheking $bmkfile..."
isbmk=pdfinfo $book |grep "Metadata Stream"| grep -c "yes"
if ${isbmk} -eq "0" ; then
echo " No bookmark in $book."
echo -n " Adding bookmark by ghostscript..."
AddBookMark
echo " Done."
else
echo " $book seems to have bookmark."
fi
echo ""
echo "## Now all stage finished. See $book status."
ending
return 0
}
# 終了処理
function ending(){
# echo " (${FUNCNAME0})"
echo ""
echo "=====SUMMERY========"
echo "Book file: $book"
pdfinfo $book |grep -e 'CreationDate\|Metadata Stream\|Pages\|Page
size\|File size'
echo "===================="
echo ""
return 0
}
# 関数を実行する:関数存在チェック付き
function ExecFunc(){
# echo " (${FUNCNAME0})"
fname=${1}
if type ${fname} >& /dev/null
then
${fname}
return $?
else
echo " No func named ${fname}"
return 1
fi
}
#################
###### Main #####
#################
# 1st check
echo "## Main titlle= ${year}${title}"
echo -n "## Firstly checking files..."
FileCheck
echo "Done. status=${status*}"
# prompt loop
while : ; do
echo ""
# Prompt
read -p "## Input Menu No.(Ret=All, 80=list, 99=quit): " input
ans=printf %u $input
# check if ans is numeric
expr "$ans" + 0 >&/dev/null
ret=$?
if $ret -ge 2 ; then
echo " Oops. Input integer please."
continue
fi
if $ans -eq 99 ; then
echo "## Exit now. Bye."
break
elif $ans -eq 90 ; then
echo "## See $book Summery."
ending
elif $ans -eq 80 ; then
echo "##### MENU ##########"
echo "status=${status*}"
for (( l=0; l<${#cklbl@}; l++))
do
echo " ${cklbl$l}"
done
echo "#####################"
elif $ans -eq 70 ; then
read -p "## Input function name: " input
FileCheck
ExecFunc ${input}
elif $ans -eq 60 ; then
FileCheck
echo " status=${status*}"
elif $ans -eq 0 ; then
echo " Exec All Steps(1--12)."
for ((y=1; y<13; y++)); do
# read -p "y=$y OK?" # for debug
FileCheck
echo " status=${status*}"
ExecFunc Stage$y
stt=$?
if $stt -eq 1 ; then
break
fi
done
elif $ans -lt 0 -o $ans -gt 13 ; then
echo " Oops. 99 to quit. "
else
FileCheck
ExecFunc Stage$ans
fi
done
★まとめ★
Unix CLIはいいねぇ!
以上.
#発表会 #script #Unix #bash #python