23 February 2011

(Ubuntu 10.04) USBモデム(REX-USB54)でfax送信

Ubuntu Linuxで、USBモデムを使ってfax送信するためのセットアップメモ

■ 検証環境
・Ubuntu 10.04
・USBモデム REX-USB56
・TA NEC Aterm IT65EX ← 内線モードで送信確認するため
・fax

20110223-modem-fax.png

■ USBモデムの認識状況

USBモデムをコンピュータに差し込む前の状態


# ls -la /dev/tty*

〜 省略 〜
crw--w---- 1 root tty 4, 8 2011-02-23 19:49 /dev/tty8
crw--w---- 1 root tty 4, 9 2011-02-23 19:49 /dev/tty9
crw-rw---- 1 root dialout 4, 64 2011-02-23 19:49 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 2011-02-23 19:49 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 2011-02-23 19:49 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 2011-02-23 19:49 /dev/ttyS3

USBモデムをコンピュータに差し込んだ状態


# ls -la /dev/tty*

〜 省略 〜
crw--w---- 1 root tty 4, 8 2011-02-23 19:49 /dev/tty8
crw--w---- 1 root tty 4, 9 2011-02-23 19:49 /dev/tty9
crw-rw---- 1 root dialout 166, 0 2011-02-23 22:36/dev/ttyACM0
crw-rw---- 1 root dialout 4, 64 2011-02-23 19:49 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 2011-02-23 19:49 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 2011-02-23 19:49 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 2011-02-23 19:49 /dev/ttyS3

USBモデムは /dev/ttyACM0 として認識された模様

モデムの情報を読みだしてみる


# cu -l /dev/ttyACM0
Connected.
ATI0
56000
ATI1
OK
ATI2
OK
ATI3
CX93001-EIS_V0.2002-V92
~. ← cuの切断コマンド
Disconnected.
#

■ efax の設定

efaxをapt-getなどでインストールして設定を行う

/etc/efax.rc

#DEV=ttyS1
DEV=ttyACM0

FROM="+1 800 555 5555" ← 適当に書き換える
NAME="Put Your Name Here" ← 適当に書き換える

#PAGE=`paperconf`
PAGE=a4

#INIT="-iZ -i&FE&D2S7=120 -i&C0"
INIT="-iZ -i&FE&D2S7=120 -i&C0 -iX3"

内線電話でダイヤルトーンを検出しないようにするため ATX3 コマンドを付け加えている。ATXコマンドについては、モデム製造メーカーのホームページに詳細に書かれている
AT COMMAND 解説 (REX-USB56)

■ PS → TIFF 変換時のGhostscriptパラメータ修正

この修正をしなくてもOKの場合があるため、まず、修正を行わずFAX送信してみる。FAX送信時に

efax: 46:56 Error: can't read multi-strip TIFF files
efax: 46:56 Error: missing offset to TIFF data

のようなエラーが出た場合は、この修正を試してみるとよい

/usr/bin/fax

# $GS -q -sDEVICE=tiffg3 -r$RES -dNOPAUSE -dSAFER \
$GS -q -sDEVICE=tiffg3 -r$RES -dNOPAUSE -dSAFER -dMaxStripSize=0 \
-sOutputFile=$BASENAME.%03d \
-sPAPERSIZE=$PAGE \

※参考資料
[kubuntu] Efax error since 10.04 upgrade
FAX モデムドライバーのインストール方法と使用方法
Details of Ghostscript output devices (MaxStripSize のリファレンス)

■ FAXの送信

適当なPDFファイルを用意する (test.pdf)

pdftops コマンドで pdf を ps に変換し、さらに fax make コマンドで ps を tiff に変換する。 最終的に tiff ファイルを fax send コマンドでFAX送信する。


$ pdftops test.pdf

$ fax make test.ps
test.ps is postscript...

$ fax send '#*1' test.ps.001
efax: Wed Feb 23 21:16:04 2011 efax v 0.9a-001114 Copyright 1999 Ed Casas
efax: 16:04 opened /dev/ttyACM0
efax: 16:05 using CX93001-EIS_V0.2002-V92 in class 1
efax: 16:05 dialing T#*1
efax: 16:25 connected
efax: 16:28 received UNKNOWN
efax: 16:28 Warning: bit-reversed HDLC frame, reversing bit order
efax: 16:28 received CSI - answering ID
efax: 16:28 remote ID -> 81 312345678
efax: 16:28 received DIS - answering capabilities
efax: 16:28 local 196lpi 14.4kbps 8.5"/215mm any 1D - - 0ms
efax: 16:28 remote 196lpi 9600bps 8.5"/215mm any 1D - - 20/10ms
efax: 16:28 session 196lpi 9600bps 8.5"/215mm any 1D - - 10ms
efax: 16:28 sent TSI - caller ID
efax: 16:29 sent DCS - session format
efax: 16:32 sent TCF - channel check of 1800 bytes
efax: 16:34 received CFR - channel OK
efax: 16:35 header:[2011/02/23 21:16 +1 800 555 5555 Put Your Name Here p. 1/1]
efax: 16:59 Warning: EOF before RTC
efax: 17:00 sent 20+1961 lines, 14130+15647 bytes, 25 s 9528 bps
efax: 17:00 sent EOP - done
efax: 17:02 received MCF - page OK
efax: 17:02 sent -> test.ps.001
efax: 17:02 sent DCN - disconnect
efax: 17:04 done, returning 0 (success)

$


■ 白黒2値化のディザリングが粗いのを解決する

ディザリングが粗いことについては 『 (Linux) GhostscriptとImageMagickを用いてFAX用ディザ2値画像を作る 』 に書いたが、その処理を自動化するシェルスクリプトを書いておいた

pdfファイルとガンマ値を指定すれば、-modという文字列を足したファイル名で新たなpdfファイルを作成される。このpdfを通常通りの手順でfax送信すれば、少しはマシなディザで送信できるかもしれない

pdf-dither.sh

#!/bin/bash

var_pdf_fname=$1
if [ "$1" == "" ]
then
echo "usage : pdf-dither <pdf file> [gamma]"
exit
elif [ ! -f $var_pdf_fname ]
then
echo "pdf file " $var_pdf_fname "not exist"
exit
fi
echo "Input pdf = " $var_pdf_fname
var_base_fname=`basename $var_pdf_fname .pdf`

if [ "$2" == "" ]
then
echo "set gamma : 0.4 (default)"
var_gamma="-gamma 0.4"
elif [ "$2" == "1" -o "$2" == "off" ]
then
echo "set gamma : off"
var_gamma=""
else
echo "set gamma :"$2
var_gamma="-gamma "$2
fi

read -p "enable force anti alias (with transparency off) ? [y/n] [N]: " var_user_input
if [ "$var_user_input" == "Y" -o "$var_user_input" == "y" ]
then
echo "force antialias : on"
var_trans="-dNOTRANSPARENCY"
elif [ "$var_user_input" == "N" -o "$var_user_input" == "n" -o "$var_user_input" == "" ]
then
echo "force antialias : off"
var_trans=""
else
echo "input error"
exit
fi

rm -f /tmp/$var_base_fname*.jpg
gs -sDEVICE=jpeg -r204x196 $var_trans -dNOPAUSE -dBATCH -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=/tmp/$var_base_fname-%03d.jpg $var_pdf_fname

rm -f /tmp/$var_base_fname*.tif
for i in /tmp/$var_base_fname*.jpg ; do [ -f $i ] && echo converting ... /tmp/`basename $i .jpg`.tif; convert $i $var_gamma -monochrome -despeckle -density 204x196 -type Bilevel -format fax /tmp/`basename $i .jpg`.tif; done

echo "Output pdf = "$var_base_fname-mod.pdf
convert /tmp/$var_base_fname*.tif $var_base_fname-mod.pdf

rm -f /tmp/$var_base_fname*.jpg
rm -f /tmp/$var_base_fname*.tif