我在网上搜索了一下,有人说可以使用 WebBrowser控件,调用WebBrowser.ExecWB()方法,示例如下:
<OBJECT id="WebBrowser" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height="0" width="0" VIEWASTEXT></OBJECT>
<script>
function printOut(){
document.all.WebBrowser.ExecWB(6,2,3);
}
</script>
网上有人指出,微软发现使用这种方法可能会造成安全问题,从IE 7 开始,不再支持该方法。我在64位Win7平台上使用IE 11测试了一下,发现这种方法确实不行。网上还有人建议仿照下面的示例方法来编写网页html文件:
<html>
<script language="vbscript">
Sub Print()
OLECMDID_PRINT = 6
OLECMDEXECOPT_DONTPROMPTUSER = 2
OLECMDEXECOPT_PROMPTUSER = 1
call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
End Sub
document.write "<object ID='WB' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>"
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="javascript:window.print();">Print</a> </div>
</form>
</body>
</html>
经过实际测试,发现还是会弹出“打印”对话框,这种方法也行不通。
如果使用IE浏览器查看网页,MeadCo公司开发了一款软件ScriptX,它是一个IE浏览器加载项,可以实现很多高级的打印功能,其中包括直接调用默认打印机进行打印。使用它打印时,不会弹出“打印”对话框。虽然ScriptX是一款商业收费软件,但是MeadCo公司大方地允许用户免费使用该软件的基本打印功能。可以在这个网页上看到对如何免费使用ScriptX的介绍:
http://scriptx.meadroid.com/license-pricing/free-deployment.aspx
下面举一个应用ScriptX的简单例子:
可以将ScriptX部署在Web服务器端,也可以在用户计算机上预先下载并安装ScriptX。这里为了做一个简单演示,直接下载ScriptX.msi文件,网址是:
http://scriptx.meadroid.com/download/user-upgrade-to-current-version.aspx
安装该文件以后,在IE中可以看到已存在ScriptX对应的加载项,如下图所示:
在设计网页时,如果我们在网页上放置一个“打印”按钮,并为该按钮编写脚本调用ScriptX,当用户点击该按钮时,执行脚本程序调用ScriptX能够直接调用默认的打印机打印出整个网页。可是如果这样处理,“打印”按钮也会被打印出来,而我们不希望看到打印出来的结果中包含“打印”按钮。要解决这个问题,一种方法是使用Div将“打印”按钮隐藏起来,这种方法在网上可以找到示例。这里介绍另一种方法:将网页分为多个frame,比如在网页中包含两个frame,在frame A中放入一个“打印”按钮,而将需要打印的内容放入frame B。整个网页的示意图如下:
接下来我们要实现点击frame A中的按钮,打印出frame B中的网页内容,这就需要跨frame调用function。可以按下面的代码设计三个网页:
1) example.html
<html>
<frameset cols="20%,80%">
<frame src="frame_A.html" name="frame_A" id="frame_A"/>
<frame src="frame_B.html" name="frame_B" id="frame_B"/>
</frameset>
</html>
2) frame_A.html
<html>
<head>
<script type="text/javascript">
function A_click(){
alert("这是frame A中定义函数给出的响应");
}
</script>
</head>
<body>
<p>这是frame A</p>
<input type="button" value="调用frame A中定义的函数" οnclick="A_click();" />
<input type="button" value="调用frame B中定义的函数" οnclick="parent.frame_B.B_click();" />
<p></p>
<input type="button" value="打印frame B" οnclick="parent.frame_B.printWindow();" />
</body>
</html>
3) frame_B.html
<html>
<head>
<script type="text/javascript">
function B_click(){
alert("这是frame B中定义函数给出的响应");
}
</script>
</head>
<body>
<p>这是frame B</p>
<input type="button" value="调用frame A中定义的函数" οnclick="parent.frame_A.A_click();" />
<input type="button" value="调用frame B中定义的函数" οnclick="B_click();" />
<!-- MeadCo ScriptX -->
<object id=factory style="display:none" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814">
</object>
<script type="text/javascript">
function printWindow()
{
factory.printing.header = "使用ScriptX打印测试";
factory.printing.portrait = true;
factory.printing.leftMargin = 1.0;
factory.printing.topMargin = 1.0;
factory.printing.rightMargin = 1.0;
factory.printing.bottomMargin = 1.0;
factory.printing.Print(false);
}
</script>
</body>
</html>
为了测试实际效果,需要将example.html、frame_A.html、frame_B.html这三个网页部署到一台Web服务器上。为了做一个简单测试,没有必要使用Apache或IIS这样重量级的Web服务器软件,建议使用Abyss Web Server X1,这个软件轻巧好用,并且是免费的。如果希望用到更多的功能,还可以购买收费的版本Abyss Web Server X2。Abyss Web Server软件的官网是:http://aprelium.com/,其中X1的下载网址是:http://aprelium.com/abyssws/download.php 。下载安装Abyss Web Server X1之后,将example.html、frame_A.html、frame_B.html这三个网页文件拷贝到Abyss Web Server X1安装目录的htdocs子目录下。启动Abyss Web Server X1,打开IE浏览器,输入网址:http://localhost/example.html,显示如下图:
点击frame A中的“打印frame B”按钮,就可以调用默认的打印设置,直接将frame B中的内容打印出来,不会弹出“打印”设置对话框。在frame A和frame B中,还放入了一些其他按钮,这些按钮是用来演示跨frame调用function的。如果只关注打印的话,可以忽略它们。
为了获得更好的打印效果,可以在frame_B.html的printWindow() function中对打印页的header、footer、页边距做一些简单的设置。如果希望在使用ScriptX时进行更高级的打印设置,就要向MeadCo公司购买License了。