2002-11-26 14:17
实现Web应用中的本地打印
邱庆华
随着Internet的飞速发展,企业纷纷开发基于Web的业务应用系统。为了实现业务系统与Internet的互联,许多企业将Web服务器和数据库系统托管在IDC(互联网数据中心),因而需要从托管在 IDC的服务器上提取业务数据在本地打印输出。通常客户端浏览器只能打印简单的HTML页面,如何才能在浏览器上实现更为强大灵活的打印输出功能呢?笔者采用相关的技术对浏览器的功能进行扩展,完成了比较复杂的数据打印任务,如收条、回执等,下面具体介绍实现这种功能的方法。图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控件即可以完成特定的打印功能,实现较为简单。
●
不足之处是需要调整浏览器的安全设置,且不支持图片和特殊字体的打印。