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水木清华站∶精华区