BBS水木清华站∶精华区
发信人: wxb1 (ben), 信区: Linux
标 题: [7/8] 网上传真
发信站: BBS 水木清华站 (Fri Jun 11 14:26:05 1999)
以Linux实作 语音/传真/EMAIL/BBC 整合系统
7.网上传真
看完前面数篇的讨论,请各位看倌想想看,若在您公司或家里架设此一
Liunx所建构的语音/传真/EMAIL/BBC 整合系统,对您平常的工作或生活有多
大的帮助呢?以我为例,我在家中架起後,也以专线连外,但除了前面提到的我
大姐与在美侄女,天天藉此联络外,我自己倒是没啥地方需用到,或许我并非大
忙人,用传统的电话、传真、EMAIL都可找得到人,并不需借助此种系统,但最
好玩的是若我要传真给别人,常常是在Windows上用WORD将文件打好後,列印出
来再用家里的传真机送出,想起来就不是很顺,而『网上传真』即是用来解决此
一问题,让您网上的Windows家族,一样可以利用此传真伺服器发送传真。
此处所用的方法,简单的说就是在Windows机器上产生PostScript或
Bitmap档案,在自动上传至Linux上的传真伺服器,转换为传真格式後,拨号送
出。一般Windows传真软体,大都由列印时,选择"传真方式"的印表机驱动程式
送出传真文件,此处的操作也类似,但因我实在没心力研究Windows Printer
Driver程式,所以需各位事先在Windows机器上,装上支援PostScript档案格式
的印表机驱动程式,若您不知那一款支援,就选择Apple LaserWriter,要"传真"
时,选择"列印",待列印视窗出现後,记得勾选"输出至档案"的选项(如下图)(略)
按确定後,即会出现存档视窗,此时存成的档案,即为标准的PostScript档,此
时将此档上传即可转换後送出。
Linux端接收上载档案,虽然可以FTP的方式,但此处我是用WWW上载的
方式来处理,其网页画面类似下图:(略)
原始HTML档为:
<HTML><BODY BGCOLOR='#FFFFFF'>
<h2>传真档案上载</h2>
<hr>
<FORM ENCTYPE='multipart/form-data' METHOD=POST ACTION='upload.cgi'>
<FONT COLOR='#ff0000'>注意:</FONT>
限用 PostScript(附加档名为 .ps ) 或 8bits 256色的Bitmap
(附加档名为 .bmp)档案 。<P>
档案名称:<INPUT TYPE='file' NAME='imgfile' SIZE=50><P>
传真号码:<input name=faxno value=""><p>
<INPUT TYPE='submit' VALUE='开始传送'> <INPUT TYPE='reset' VALUE='清除'>
</FORM><HR NOSHADE><P>
使用说明:<P>
1.一 定 要 是 PostScript 或 256 色 Bitmap 格 式 的 档 案 才 可 传 真!<br>
2.Bitmap 转 成 256 色 工 具 <a href=bmpto8.zip>bmpto8</a><br>
3.传 真 由 桃 园 县 (03) 电 话 发 出 , 其 余 地 区 请 加 "区码" !<br>
4.NETSCAPE 3.0 以 上 或 IE4.0 以 上 版 本 才 能 使 用 。<BR>
5.档 案 名 称 请 尽 量 不 要 使 用 中 文 及 长 档 名 , 以 免 冲 码 。<P>
</BODY></HTML>
当选好档案,将传真号码填好,按"开始传送"後,背後的CGI程式除了接收档案
外,也会进行转档的动作,除了将档案转成传真的G3格式外,也会转成GIF档,
方便您透过网页即可直接观看、确认,不过GIF档为彩色,最後送出的传真可是
黑白的喔!CGI的原始码如下:
upload.cgi
#!/usr/bin/perl
#===============================================================
$path = "/home/fhl/hybj/WWW/fax/";
#===============================================================
print "Content-type: text/html","\n\n";
print "<HTML><body>", "\n";
read (STDIN, $string, $ENV{'CONTENT_LENGTH'});
@lines = split(/\r\n/, $string);
$id=0;
$store=0;
# $prevLine="";
foreach $line (@lines) {
$id++;
if ($id == 1) {
$boundary = $line;
}elsif ($store==-1 && $line =~ /name="faxno"/) {
$store=-2;
}elsif ($store==-2 && length($line)>=7) {
$faxno = $line;
last;
}elsif ($store==0 && $line =~ /filename="(.+)"/) {
$file = $1;
$file =~ s/\//\\/g;
if ($file =~ /^(((.*)\\)*)(.+)/) {
$file = "$path$4";
$nameonly="$4";
}
}elsif ($store==0 && length($line)<=1) {
$store = 1;
$len = length($line);
open (F, "> $file");
print "存档 OK!!";
}elsif ($store>=1) {
if ($line =~ $boundary) {
$store=-1;
}else{
if ($store>1) {
print F "\r\n";
}
print F "$line";
$store++;
}
}
}
close(F);
print "<p>传真号码:$faxno!!<p>\n";
open(FF, "> ${path}${faxno}_${nameonly}.out");
print FF "$faxno $nameonly";
close(FF);
print "<p>转档中....请稍候查看底下传真记录档!!<br><pre>\n";
system("/home/fhl/hybj/WWW/fax/chkfax_r&");
chkfax_r
#!/bin/bash
FAXPATH="/home/fhl/hybj/WWW/fax"
CUT="/usr/bin/cut"
DATE="/bin/date"
ECHO="/bin/echo"
FIND="/usr/bin/find"
RM="/bin/rm"
cd $FAXPATH
faxout=`$FIND ./*.out -printf "%p "`
for FILE in $faxout
do
read line < $FILE
faxno=`$ECHO -n $line | cut -d " " -f1,1`
file=`$ECHO -n $line | cut -d " " -f2,2`
ext=`$ECHO -n $file | cut -d "." -f2,2`
if [ "$ext" = "ps" ]; then
${FAXPATH}/pstofaxg3 $file $faxno
else
if [ "$ext" = "bmp" ]; then
${FAXPATH}/bmptofaxg3 $file $faxno
else
$ECHO "Out of EXT:$ext"
exit
fi
fi
$RM -f $FILE
$RM -f $file
done
# For html output
$ECHO "</pre><br><a href=$faxno.html>传真记录档</a><p>"
$ECHO "</pre></body></html>"
因PostScript转换为传真档,可能为好几页,当点选"传真记录档"後,可观看
由PostScript转换成的好几页各别GIF档案,其中将PostScript转为G3及GIF的
pstofaxg3如下:
#!/bin/bash
FAXPATH="/home/fhl/hybj/WWW/fax"
CallOutPath="/user/home/message/fax/"
TTYS=ttyS1
VMCP="/usr/bin/vmcp -d$TTYS"
AT_FAX="ATm0l0#CLS=2"
CUT="/usr/bin/cut"
DATE="/bin/date"
ECHO="/bin/echo"
DIFF="/usr/bin/diff"
FIND="/usr/bin/find"
PSTOPNM="/usr/bin/pstopnm"
EFIX="/usr/bin/efix"
RM="/bin/rm"
cd $FAXPATH
FILENAME=`$ECHO $1 | $CUT -d "." -f1,1`
faxphone=$2
$ECHO "<html><body bgcolor=#FFFFFF>" > $faxphone.html
$ECHO `$DATE` >> $faxphone.html
$ECHO "<p><ul>FAX Page List:<br>" >> $faxphone.html
$PSTOPNM -pbm -xsize 1728 $1
$PSTOPNM -ppm $1
pbmfiles=`$FIND ./${FILENAME}*.pbm -printf "%f "`
# $ECHO $pbmfiles
for FILE in $pbmfiles
do
/usr/bin/pbmtog3 $FILE > ${CallOutPath}g3fax/$FILE.g3
g3files="${g3files} ${CallOutPath}g3fax/${FILE}.g3"
done
$ECHO $g3files > ${CallOutPath}callout/${faxphone}.callout
ppmfiles=`$FIND ./${FILENAME}*.ppm -printf "%f "`
no=1
for FILE in $ppmfiles
do
/usr/bin/ppmtogif $FILE > ${FILE}.gif
$ECHO "<li><a href=${FILE}.gif>Page $no</a>" >> $faxphone.html
no=`expr $no + 1`
done
$ECHO "</ul></body></html>" >> $faxphone.html
$RM -f ./${FILENAME}*.ppm
$RM -f ./${FILENAME}*.pbm
做完这些步骤,已将 *.g3 档,及 .callout 档,存放置适当的目录之下,我们
此时仅需略为修改前面几篇(主动传真服务部份)的FaxCallout部份即可,
FaxCallOut()
{
faxout=`$FIND ${CALLOUT_PATH}* -printf "%f "`
if [ `$ECHO -n $faxout | $WC -w` -gt "0" ]; then
for FILE in $faxout
do
read faxfiles < ${CALLOUT_PATH}$FILE
if [ `$ECHO -n $faxfiles | $WC -w` -gt "0" ]; then
if [ -f ${MAINPATH}conf/$FILE.reg ]; then
read userReg < ${MAINPATH}conf/$FILE.reg
faxphone=`echo $userReg | cut -d"," -f7,7 -s`
else
# --新增此段-------For PostSccript & Bitmap to G3 and FAX it----
faxphone=`echo $FILE | cut -d"." -f1,1`
fi
if [ $faxphone ]; then
$VMCP -c"$AT_FAX" -wOK
/usr/bin/efax -d /dev/$TTYS -t"$faxphone" $faxfiles
if [ $? -eq 0 ]; then
$RM -f ${CALLOUT_PATH}$FILE
fi
fi
fi
done
fi
exec ${MAINPATH}bin/answer
}
诸位一定会质疑,先存成PostScript档,再叫起浏览器,输入网址,填
档案名称及传真号码,再按"开始传送",这样的过程不是太麻烦了吗?没错!因
此您可透过upload.exe,仅需将PostScript档存到您预先设定的目录中,剩下的
事,upload.exe都帮您代劳了!唯一要注意的事是所存的档名,需为
"电话号码.ps",其中电话号码就是您传真数据机要拨的对方号码,至於是否要
加区码,端视您及对方所在区域而定。Upload.exe执行後并无画面出现,仅在右
下角工作列上出现一FAX的图示,以滑鼠右键点选後会有Popup选单出现,选取
"参数设定",会出现下图:(略)
根据您的电脑,填入相关设定,按"储存"即可,以此例而言,其每30秒即会至
C:\chu\fax\upload\ 此目录下搜寻所有的*.ps及*.bmp档,上传至
http://150.9.1.1/cgi-bin/upload.cgi 的网址,在档案上载的过程中,工作
列上的原FAX图示,会改变为沙漏的动画图示,直至传档完毕;此外在搜寻目录
中传档完毕的档案,其档名後会附加传档完毕的时间,如 23537643.ps 经传档
结束,变为 23537643.ps.1436 ,表示其在下午14时36分传档完成。
除了列印时选PostScript存档传真外,很多时候我们也会想将萤幕上
的部份画面截取下来,传真给朋友,此时就需用到萤幕截取程式了,在
upload.exe的Popup选单中,有一项即为萤幕截取,此时upload.exe会尝试叫起
另一ScrCapF.exe,其画面如下:(略)
其可抓取三方面,分别为桌面(整个Desktop)、区域(以滑鼠拖放选取)、物件
(Windows Object),等截取後会show在其下的区域中,此时您可选择存档(Bitmap
或Jpeg),复制(至剪贴簿)、列印(直接送至印表机,不会有印表机视窗出现)、传
真(存成8bits 256色的Bitmap档,目录请选upload.exe中设定的搜寻目录),您一
定会觉得奇怪,为啥一定要存成256色的Bitmap档,其实之所以如此,是因在Linux
上的转换程式(bmptoppm)不认识高过256色的Bitmap格式缘故,但若您已经有一些
全彩的图要传真怎麽办呢?别急,我还写了一个程式,在upload.exe的Popup选单
中有一项"BMP转换",可叫起bmpto8.exe,如下图:(略)
您可藉此Load任一Bitmap档,再存成另一256色的Bitmap图档,如此就可传真了!
後记
目前的CGI是接收档案完即开始转档,除了传真的G3档外,也转一份成GIF
,以便上传的浏览器可以观看确认,但说实在的,转换需要一段时间,若此时是用
upload.exe的方式,您会看到尽管已传完档了,但沙漏还是持续了好一阵子,一直
到整个http session结束,才转为FAX的图示,所以若确定用upload.exe的方式传
档,可以去掉程式中转GIF的部份,或乾脆将chkfax_r的部份移除,另加入到
crontab中,如此即可传档完毕即返回。
Upload.exe、ScrCapF.exe、BmpTo8.exe三程式可放於同一目录下,并於
此目录执行起upload.exe即可。此三程式可於
http://tech.fhl.net/~hybj/fax/download.cgi处下载!
综合前面几篇及本篇所述,语音/传真/EMAIL/BBC 整合系统的各项功
能,大都已完整描述,接下来的最後一篇,主要在说明此系统的一些辅助程式,
如逾期删除功能、客户资料WWW辅助设定、及如何利用此系统延伸出在WWW键入文
字,转成传真的功能。
撰文:朱先宇 1999/06/08
EMAIL: hybj@ms1.hinet.net
--
just a test
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.116.130.100]
BBS水木清华站∶精华区