深蓝海域KMPRO

实现Web应用中的本地打印

2002-11-26 14:17

实现Web应用中的本地打印

 邱庆华  

随着Internet的飞速发展,企业纷纷开发基于Web的业务应用系统。为了实现业务系统与Internet的互联,许多企业将Web服务器和数据库系统托管在IDC(互联网数据中心),因而需要从托管在 IDC的服务器上提取业务数据在本地打印输出。通常客户端浏览器只能打印简单的HTML页面,如何才能在浏览器上实现更为强大灵活的打印输出功能呢?笔者采用相关的技术对浏览器的功能进行扩展,完成了比较复杂的数据打印任务,如收条、回执等,下面具体介绍实现这种功能的方法。

FileSystem组件使用简介

FileSystem组件是一个ActiveX控件,存在于Windows平台中(不管是Win98、Win2000,还是NT操作系统都包含该组件),它的CLSID是“0D43FE01-11CF-8940-00A0C9054228”。熟悉ASP编程方法的人可能有许多使用过FileSystem组件,一般情况下该组件用在服务器端,用来对文本文件、文件夹及驱动器进行访问和控制。可以通过两种方法创建FileSystem组件的对象实例:

1. 使用ASP内置的Server对象的方法Server.CreateObject来创建服务器端对象的实例。

2. 使用VBScript脚本函数CreateObject来创建客户端对象的实例(也可以在服务器端使用该方法,但有时会出错,一般不建议使用)。

FileSystem组件有如下一些方法可以对文本文件进行操作: 

● CreateTextFile(Filename,[Overwrite if exists],[Unicode/ASCII])
//创建文本文件
● OpenTextFile(Filename,[Input/output mode],[Create if not exists],[Format])
//打开文本文件
● CopyFile(Filename1,Filename2,[Overwrite])
//拷贝文本文件
● MoveFile(Filename1,Filename2)
//移动文本文件
● DeleteFile(Filename) 
//删除文本文件
● GetFile(Filename)
//获得文本文件
● FileExists(Filename)

//判断文本文件是否存在

FileSystem组件对文件夹和驱动器也有和操作文本文件相类似的方法,在此不一一赘述。

FileSystem组件也可用于客户端。如果采用创建FileSystem组件对象实例的第二种方法,就可以借助该组件对客户端系统的文本文件、文件夹及驱动器进行访问和控制。因为Windows系统带有FileSystem组件,所以Windows平台的客户端不需要另外从远程服务器上下载它,在安装操作系统时会自动安装这个组件并注册;而对于其他平台的客户端,则需要安装插件并下载FileSystem组件。

本地打印的实现机制


利用FileSystem组件实现本地打印的过程如图1所示: 

图1 本地打印的实现原理


1. 客户端向Web服务器发送数据请求;

2. Web服务器根据业务处理逻辑与后台数据库进行交互,取得所需的数据并生成HTML页面(其中有操作FileSystem组件对象的VBScript脚本),然后向客户端浏览器发回HTML页面;

3. 在客户端运行脚本,取出HTML页面中的数据,建立与打印机的连接,并向打印机输出打印数据。

前两步与一般的Web应用没有什么区别,需要说明的是第三步: 首先使用VBScript脚本函数CreateObject来创建FileSystem组件对象的实例;然后调用该实例创建文本文件的CreateTextFile方法,把打印端口LPT1或LPT2作为文件名参数,并将可否覆盖文件的参数设为TRUE,建立与打印机的连接; 最后调用获得的打印机文本文件流实例的写文本方法WriteLine,向打印机输出打印的内容。

程序示例

程序代码分为客户端执行的脚本和服务器端执行的脚本,客户端执行的脚本如下: 

<script Language=VBScript>
function print_onclick
//打印函数
dim label
label=document.printinfo.label.value
//获得HTML页面里的数据
set objfs=CreateObject(“Scripting.FileSystemObject”)
//创建FileSystem组件对象的实例
set objprinter=objfs.CreateTextFile (“LPT1:”,true)
//建立与打印机的连接
objprinter.Writeline(“___________________”)
//输出打印的内容
objprinter.Writeline(“| |”)
objprinter.Writeline(“| 您打印的数据是:”&label& “|”)
objprinter.Writeline(“| |”)
objprinter.Writeline(“|________________|”)
objprinter.close
//断开与打印机的连接
set objprinter=nothing
set objfs=nothing
// 关闭FileSystem组件对象
end function
</script>
服务器端执行的脚本如下:
<%……
set conn=Server.CreateObject (“adodb.connection”)
conn.Open “DSN=name;UID=XXXX;PWD=XXXX;”
set rs=server.CreateObject(“adodb.recordset”)
rs.Open(“select ……”, conn, 1, 1)
……%>
//与数据库进行交互
HTML页面其他代码:
<HTML>
……
<FORM ID=printinfo NAME=“printinfo”>
<INPUT type=“button” value=“打印>>” id=print name=print >
//调用打印函数
<INPUT type=hidden id=text1 name=label value=<%=……%>>
//保存服务器端传来的数据
……
</HTML>

小 结

● 使用此方法实现打印任务之前,必须调整浏览器的安全设置。通过降低浏览器的Internet选项上的安全级别,对自己的站点充分信任,才可以通过浏览器执行脚本访问本机资源。

● 本方法可以实现在局域网的打印机上打印远程服务器的数据。只需用局域网上的打印机注册在本地的端口代替本地打印机端口作为创建文本文件的CreateTextFile方法的参数即可。

● 本方法可以实现根据用户的要求选择打印的宽度、高度、数量和内容,并可重复打印。

● 不需要编写ActiveX控件即可以完成特定的打印功能,实现较为简单。

● 不足之处是需要调整浏览器的安全设置,且不支持图片和特殊字体的打印。 

相关推荐