HTML文書を作成しPDF変換する

所望のキーワードに従いデータベースを検索してHTML表を作成するコマンドが有ります。このコマンドにファイルから読み込んだキーワードを与え、作成したHTML文書をPDF変換し、さらに pdftkコマンドを用いて結合して、ひとつのPDF文書とします。

#!/bin/bash

# 外部ファイル keyword.txt の中身を配列変数 ${key} に格納する
declare -a key=( \
`cat keyword.txt |\
 sed -n '1,999p'` \
)
left_margin=25   # 左余白の設定
right_margin=15  # 右余白の設定
top_margin=15    # 上余白の設定
bottom_margin=18 # 下余白の設定

# 一時ファイルの作成
temp_html=`mktemp ./XXXX.html` 
temp_pdf=`mktemp ./XXXX.pdf`

# 事前に表紙となる original.pdf を作成しておく
# これを ${output_pdf} として使用する 
output_pdf="目的のPDF.pdf"
cp original.pdf ${output_pdf}

for (( i=0; i<${#key[*]}; i++ ))
do
 echo ${key[$i]}
# データベースよりKEYオプションに応じて検索を実施し、
# HTML文書を作成する自作コマンド
 ./make_html key=${key[$i]} > ${temp_html}

# wkhtmltopdf にて PDF文書に変換 
# ( 余白の設定については https://stackoverrun.com/ja/q/10907299 を参考)
 wkhtmltopdf -q -T ${top_margin} -B ${bottom_margin} \
    -L ${left_margin} -R ${right_margin} ${temp_html} ${temp_pdf} \
    >/dev/null 2>&1

# pdftk で結合の実施
# 一時ファイル ${united_pdf} に出力し、
# ${output_pdf} にファイル名変更することで
# 再帰的な結合を繰り返す
 united_pdf=`mktemp ./XXX.pdf`
 pdftk ${output_pdf} ${temp_pdf} cat output ${united_pdf}
 mv ${united_pdf} ${output_pdf}
done

rm ${temp_html} ${temp_pdf}

 

 HTMLを作成する自作コマンド make_html については以下に示します。今回の主眼ではありませんので、特にコメントは付けてません。

#!/bin/bash
key=`getparstr $# "$*" "key"`

#################################################
host=xxx.xxx.xxx.xxx
temp=`mktemp ./XXXX`
if [ ! -z "${key}" ]
then
mysql -h ${host} -N ${DATABASE} << _SQL_ > $temp
 select v.id,ch,py,ja from vocabulary v
  right join keyword k on k.id=v.id
  where k.word like "%${key}%"
  order by k.sub_id,v.id;
_SQL_
else
 rm $temp; exit
fi

cat << _HEADER_ > /dev/stdout <table border="1"> <caption><span style="font-size: 150%;">${key}</span></caption> <meta http-equiv="content-type" charset="utf-8"> <tr> <th>番号</th> <th>中国語</th> <th> 拼音</th> <th>日本語</th> </tr> _HEADER_ cat $temp |\ awk -F"\t" --assign line="$line" \ '{printf "<tr>\n"} \ {printf "<td>%d</td>\n",$1} \ {printf "<td>%s</td>\n",$2} \ {printf "<td>%s</td>\n",$3} \ {printf "<td style=\"font-size:80%;\">%s</td>\n",$4} \ {printf "</tr>\n"}' >> /dev/stdout cat << _FOOTER_ >> /dev/stdout </table> _FOOTER_ rm $temp; exit