hylafaxで日本語を送信するために、日本語テキストをPostscriptへ変換するツールを探していました。
半角カナに対応しているツールが見当たらないので自分で作ってみました。
Postscriptはまったく知らなかったので中古で青本を買いなんとか作ったといった感じです。
このツールは、utf8のテキストファイルからPostscriptファイルを作成します。nkfを使えばutf8にあらかじめ変換できます。
オプションの妥当性検査などまったく行ってないので正しく与えてください。
また、半角のチルダが化けます。いまのところ良いアイディアがないので諦めてます。
ただのシェルスクリプトなので、いろいろ変更してつかえると思います。特に、用紙サイズなどは、簡単にスクリプトに追加できると思いますし、そのように作ってあります。
拡大、縮小のオプションも作ろうかと思ったのですが、フォントサイズを小さくしたり、大きくしたりすればいいだけなのでやめました。
以下、使い方です。
> ./utf82ps -h
Usage: utf82ps [-p A4|A3|B5|B4|15i] [-L] [-m margin-left,right,top,bottom] [-f fontsize ] [ -l space-line% ] [ -w font-width% ] [ -g ] file
-p: 用紙サイズ 指定しない場合A4です。
-L: 用紙方向 ポートレート(Portraite) / ランドスケープ(Landscape)です。指定しないと縦で、-Lを指定すると横になります。
-m: 余白 ソースを見れば、用紙別に設定してあるのがわかると思います。 設定は、左、右、上、下と設定します。例) -m 12,5,7,5
-f: フォントサイズ 指定しない場合12ptです。
-l: 行文字間隔 指定しない場合フォントサイズの10%です。指定はフォントサイズに対しての割合(%)を指定します。
-w: フォント幅 指定しない場合は100%です。
-g: フォント 指定しない場合は、Ryumin-Light(明朝体)が使われ、指定するとGothicBBB-Medium(ゴシック体)が使われます。
使用例
> nkf -wx foo.txt | utf82ps > foo.ps
ダウンロード utf82ps
以下、スクリプトのソース。
#!/bin/sh
# -------------------------------------
# 2014.07.11
# utf82ps
# -------------------------------------
# -------------------------------------
# パラメータ変数
# -------------------------------------
c_Usage="Usage: utf82ps [-p A4|A3|B5|B4|15i] [-L] [-m margin-left,right,top,bottom] [-f fontsize ] [ -l line-space% ] [ -w font-width% ] [ -g ] file"
c_PaperSize="A4"
c_PaperMargin=""
c_Landscape="no"
d_FontSize="12" # point
d_LineSpace="10" # % d_FontSize / 100 * d_LineSpace
d_FontWidth="100" # % d_FontSize / 100 * d_FontWidth
c_MincyoFont="/Ryumin-Light-UniJIS-UTF8-H"
c_GothicFont="/GothicBBB-Medium-UniJIS-UTF8-H"
c_DefaultFont=$c_MincyoFont
#c_DefaultFont=$c_GothicFont
# -------------------------------------
# 用紙のルックアップテーブル
# -------------------------------------
# 15iはおそらく使わないと思いますがサンプルとして。15iは用紙方向を変えたくないので二つともPortになってます。
# paper margi paper size orientation
# left right top bottom x y default swich
c_PaperTable="
A4 25.4 12.7 25.4 12.7 210 297 Port Land
A3 25.4 12.7 25.4 12.7 297 420 Port Land
B5 25.4 12.7 25.4 12.7 182 257 Port Land
B4 25.4 12.7 25.4 12.7 257 364 Port Land
15i 0 0 0 0 381 279.4 Port Port
"
# -------------------------------------
# パラメータ処理
# -------------------------------------
while getopts "p:Lm:f:l:w:gh" OPT
do
case ${OPT} in
p) c_PaperSize=${OPTARG} ;;
L) c_Landscape="yes" ;;
m) c_PaperMargin=${OPTARG} ;;
f) d_FontSize=${OPTARG} ;;
l) d_LineSpace=${OPTARG} ;;
w) d_FontWidth=${OPTARG} ;;
g) c_DefaultFont=$c_GothicFont ;;
h|\?) echo "$c_Usage"; exit 1;;
esac
done
shift `expr ${OPTIND} - 1`
# -------------------------------------
# 入力の統一
# -------------------------------------
if [ "${1}" != "" ]; then
exec <"${1}"
fi
# -------------------------------------
# マージン取得
# -------------------------------------
if [ "${c_PaperMargin}" = "" ]; then
c_Table=`echo "${c_PaperTable}" | grep "${c_PaperSize}"`
else
c_tab=`printf "\t"`
c_Temp=`echo "${c_PaperMargin}" | sed -e s/,/"${c_tab}"/g`
c_Table="${c_PaperSize}$c_tab${c_Temp}"
fi
for i in `seq 2 5`
do
d_Temp=`echo "${c_Table}" | cut -f${i}`
case ${i} in
2) d_MarginLeft=${d_Temp} ;;
3) d_MarginRight=${d_Temp} ;;
4) d_MarginTop=${d_Temp} ;;
5) d_MarginBottom=${d_Temp} ;;
esac
done
# -------------------------------------
# 用紙サイズ取得
# -------------------------------------
c_Table=`echo "${c_PaperTable}" | grep "${c_PaperSize}"`
for i in `seq 6 7`
do
d_Temp=`echo "${c_Table}" | cut -f${i}`
case ${i} in
6) d_PaperSizeX=${d_Temp} ;;
7) d_PaperSizeY=${d_Temp} ;;
esac
done
# -------------------------------------
# 用紙方向取得
# -------------------------------------
c_Table=`echo "${c_PaperTable}" | grep "${c_PaperSize}"`
for i in `seq 8 9`
do
d_Temp=`echo "${c_Table}" | cut -f${i}`
case ${i} in
8) c_PaperOrientation=${d_Temp} ;;
9) if [ "${c_Landscape}" = "yes" ]; then
c_PaperOrientation=${d_Temp}
fi
;;
esac
done
if [ "${c_PaperOrientation}" = "Land" ]; then
d_Temp=${d_PaperSizeX}
d_PaperSizeX=${d_PaperSizeY}
d_PaperSizeY=${d_Temp}
fi
# -------------------------------------
# Postscript出力
# -------------------------------------
echo "%!PS-Adobe-3.0"
echo "/mm {2.834645669 mul} def"
echo "/d_MarginLeft ${d_MarginLeft} mm def"
echo "/d_MarginRight ${d_PaperSizeX} mm ${d_MarginRight} mm sub def"
echo "/d_MarginTop ${d_PaperSizeY} mm ${d_MarginTop} mm sub def"
echo "/d_MarginBottom ${d_MarginBottom} mm def"
echo "/d_FontSize ${d_FontSize} def"
echo "/d_LineSpace d_FontSize 100 div ${d_LineSpace} mul def"
echo "/d_FontWidth d_FontSize 100 div ${d_FontWidth} mul def"
echo "/c_DefaltFont ${c_DefaultFont} findfont [ d_FontWidth 0 0 d_FontSize 0 0 ] makefont def"
echo "%"
echo "/d_1ByteCh { 16#7f le } def"
echo "/d_2ByteCh { dup 16#cf ge exch 16#df le and } def"
echo "/d_3ByteCh { 16#ef le } def"
echo "/d_4ByteCh { dup 16#f0 ge exch 16#f7 le and } def"
echo "/d_5ByteCh { dup 16#f8 ge exch 16#fb le and } def"
echo "/d_6ByteCh { dup 16#fc ge exch 16#fd le and } def"
echo "%"
echo "/c_BeforSt { 0 exch getinterval } def"
echo "/d_AfterStDic 1 dict def"
echo "/c_AfterSt {
d_AfterStDic begin
/d_Start exch def
/c_PrintSt exch def
/d_Length c_PrintSt length d_Start sub def
c_PrintSt d_Start d_Length getinterval
end
} def"
echo "/d_StringCutDic 1 dict def"
echo "/c_StringCut {
d_StringCutDic begin
/c_PrintSt exch def
1 {
c_PrintSt 0 get d_1ByteCh { 1 /d_Byte exch def exit } if
c_PrintSt 0 get d_2ByteCh { 2 /d_Byte exch def exit } if
c_PrintSt 0 get d_3ByteCh { 3 /d_Byte exch def exit } if
c_PrintSt 0 get d_4ByteCh { 4 /d_Byte exch def exit } if
c_PrintSt 0 get d_5ByteCh { 5 /d_Byte exch def exit } if
c_PrintSt 0 get d_6ByteCh { 6 /d_Byte exch def exit } if
} repeat
c_PrintSt d_Byte c_AfterSt c_PrintSt d_Byte c_BeforSt
end
} def"
echo "%"
echo -n "/f_NewPage { "
if [ "${c_PaperOrientation}" = "Land" ]; then
echo -n "90 rotate 0 ${d_PaperSizeY} mm -1 mul translate "
fi
echo "d_MarginLeft d_MarginTop d_FontSize sub moveto } def"
echo "/f_NewLine { d_MarginLeft currentpoint exch pop d_FontSize sub d_LineSpace sub moveto } def"
echo "/f_NextString { dup length 0 gt { f_ShowStrings } { pop } ifelse } def"
echo "/f_ShowStrings {
c_StringCut
dup stringwidth pop currentpoint pop add
d_MarginRight gt { f_NewLine } if
currentpoint exch pop d_FontSize sub
d_MarginBottom lt { showpage f_NewPage } if
show f_NextString
} def"
echo "c_DefaltFont setfont"
echo "f_NewPage"
# -------------------------------------
# データ読み込み
# -------------------------------------
c_x0a=`printf "\x0a"` # 改行
c_x0c=`printf "\x0c"` # 改ページ
c_x09=`printf "\x09"` # タブ
c_Tab=`printf " "` # 置換後タブ 空白8文字
while IFS= read -r c_Line
do
if [ "${c_Line}" = "${c_x0a}" ]; then
echo "f_NewLine"
elif [ "${c_Line}" = "${c_x0c}" ]; then
echo "showpage f_NewPage"
else
echo -n "("
echo -n "${c_Line}" | sed -e "s/\\\/\\\\\\\/g" -e "s/(/\\\(/g" -e "s/)/\\\)/g" -e "s/${c_x09}/${c_Tab}/g"
echo " ) f_ShowStrings f_NewLine"
fi
done
# -------------------------------------
#
# -------------------------------------
echo "showpage"