最近碰到一个难题:对 IE 页面中的内容进行横向打印,而且是无需用户选择的进行横向打印,而一直一来在IE 中打印页面,要想进行横向的打印,必须要手工进行选择,然后打印,但要求如此,没办法,只能找解决方法。
但,在网上百度了很多次,依然没有找到合适简单的处理方式,要不就需要 ActiveX 控件,要不然就非常复杂。终于在别人的帮助下,我找到了这个页面,看起来很简单。页面地址如下:
http://web.tampabay.rr.com/bmerkey/examples/landscape-test.html
我根据其方法,写了一段简单的测试代码,经验证,完成成功,当然仅对 Text 及 Tabel 组成的页面。代码如下:
<html>
<head>
<title>Landscape Printing</title>
<style type="text/css" media="print">
<!--
div.page {
writing-mode: tb-rl;
height: 80%;
margin: 10% 0%;
}
div.page table {
margin-right: 80pt;
filter: progid:DXImageTransform.Microsoft.BasicImage(Rotation=1);
}
-->
</style>
</head>
<body>
<div class="page">
This is a test first row<br>
This is a test second row
<table border='1'>
<tr>
<td >aaa</td>
<td >bbb</td>
<td >ccc</td>
<td >ddd</td>
</tr>
<tr>
<td >123</td>
<td >456</td>
<td >789</td>
<td >012</td>
</tr>
</table>
</div>
</body>
</html>
但后来发现一个问题,即当想在一个页面出现多个 Table 时,版面很不易控制,会出现以下几种情况:
1, 如Table 中行数很多,则会出现前几行无法显示或会和后几行重叠的情况;
2, 两个 Table 的间隔距离无法象正常显示一样,而会变的很大;
3, 必须手动控制每个页的大小,如内容超出页的大小,则相关内容会消失,这样你必须进和手工的分页处理;
4, 如有文字在 Table 的前后,相互间的间隔一样会不易控制。
以上问题很是麻烦,花费近一天时间仍没有解决。:(
上面的方法用很简单的CSS 完成的处理,但有上面提到的几个问题,所以只能应用于一些简单的页面。而不适合对复杂页面的横向打印。
经过一段时间的查找,终于发现一种方法,但却必须使用 "WScript.Shell" 对象才能实现。具体例子如下(其中还可以实现不打印指定的按钮或控件,使用Style 实现):
<HTML><HEAD><TITLE>Print</TITLE>
<!--media=print 这个属性说明可以在打印时有效-->
<!--希望打印时不显示的内容设置class="Noprint"样式-->
<!--希望人为设置分页的位置设置class="PageNext"样式-->
<style media="print">
<!--
.Noprint{display:none;}
.PageNext{page-break-after:always;}
-->
</style>
<script language="JavaScript">
DA = (document.all) ? 1 : 0
shell = new ActiveXObject("WScript.Shell");
setTimeout("shell.sendKeys('%fu')",1000); //works same as alt+F+U
setTimeout("shell.sendKeys('A')",1100); //to set the size as A4 press a 2 times
setTimeout("shell.sendKeys('A')",1200);
setTimeout("shell.sendKeys('%a')",1200); // Orientation: Select "Landscape"
setTimeout("shell.sendKeys('{ENTER}')",1300);
function winPrintDialogBox()
{
window.print(); //then call window.print()
}
function HandleError()
{
alert("/nNothing was printed. /n/nIf you do want to print this page, then/nclick on the printer icon in the toolbar above.")
return true;
}
</script>
<script language="VBScript">
Sub window_onunload()
On Error Resume Next
Set WB = nothing
On Error Goto 0
End Sub
Sub Print()
OLECMDID_PRINT = 6
OLECMDEXECOPT_DONTPROMPTUSER = 2
OLECMDEXECOPT_PROMPTUSER = 1
On Error Resume Next
If DA Then
call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
Else
call WB.IOleCommandTarget.Exec(OLECMDID_PRINT ,OLECMDEXECOPT_DONTPROMPTUSER,"","","")
End If
If Err.Number <> 0 Then
If DA Then
Alert("Nothing Printed :" & err.number & " : " & err.description)
Else
HandleError()
End if
End If
On Error Goto 0
End Sub
If DA Then
wbvers="8856F961-340A-11D0-A96B-00C04FD705A2"
Else
wbvers="EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B"
End If
document.write "<object ID=""WB"" WIDTH=0 HEIGHT=0 CLASSID=""CLSID:"
document.write wbvers & """> </object>"
</script>
</HEAD>
<BODY>
<INPUT class="Noprint" style="WIDTH: 100px; HEIGHT: 30px" οnclick=onClick=window.print() type=button align=right value=Print>
<Pre> This is a testing page for Landscape print.</Pre>
</BODY</HTML>