希望大家可以指正其中的疏漏之处。
基于web的打印是目前一个比较麻烦的问题,解决方法一般是用
active控件或者applet实现,这些方法都依赖于浏览器对安全
的限制。这里提出的方法是直接调用ie的打印接口window.print()
方法,实现客户端的打印。
ie的打印接口功能非常简单,仅仅是将当前页面或者当前帧的内容
简单的打印到打印机上,没用提供任何有用的用于打印控制的api。
要想控制,就只有在html标签上下功夫了。
先讲讲普通的打印,即不需要套打的情况。
首先,整个页面应该是基于frame结构的。一个主要的frame用于显示
给用户,另外后台隐藏一个帧,我将其命名为print_frame,
当用户要求打印时,刷新print_frame,将要打印的内容组织成html传给
print_frame,另外在该html中加入以下脚本:
<SCRIPT FOR=window EVENT=onload LANGUAGE=/"JScript/">
?? parent.print_frame.focus();
??window.print();
</SCRIPT>
当print_frame刷新完成后ie的打印对话框会自动跳出来要求选择打印格式
之类的东西,确定后ie会打印隐藏的打印帧的内容
(就是parent.print_frame.focus();这句确定的);
这时,面临的关键问题就是页面元素的定位了,这没有别的办法,只有一次次的试
了。记住,用象素定位而不要用百分比定位(所有的元素应该在表格中,只需要设定
table的列宽和列高就可以定位了)。一个屏幕象素等于打印机的0.01英寸,如何定
位就靠自己去算了。
关于套打。
其实上面提到的打印的实现方法对于套打是同样的,将不需要打印的部分去掉,只要
处理好定位的问题就可以了。关键可能是预览和套打如何协调。
在前台的主页面上显示预览的画面给客户,当客户打印时将同样的html传到隐藏帧显然
是不能实现套打的。那么维护两段基本相同的代码吗?这似乎太笨拙了,我的处理方法
是专门写了一个修正html标签的函数来处理要传递给打印帧的html。该函数实现的
主要功能是首先,要修正table的线条属性,先搜索到‘border=’的字符串,为保险起见,
我没有删除它,而是将其替换为‘oldborder=’,然后在该位置再加入一个‘border=0’
的属性设置。第二步,是处理有些字符在预览时需要显示而打印时不需要打印的,这需要在
显示预览的html中引入一个特殊的标记<preview></preview>,这个标记是我自己定义的,
ie并不支持,正因为ie不支持,所以,该标记对于预览的显示不会造成任何影响。在需要打印
时,修正函数搜索这两个标记,将它们之间的字符全部替换为等长的&
n b s p ;
.至此,套打
的问题就已经没有什么需要解决的了。