一.概述
對基於B/S架構的應用程式而言,用戶端的頁面列印一直是比較頭疼的問題,簡單的做法是:1.使用IE的列印功能;2.使用水晶報表。但以上兩種辦法,都有很大的局限性,很難實現特殊要求的排版和精確的定位,所以不能滿足一些特殊客戶的BT要求。為此,本人總結了自己在使用Web列印上的一點經驗,和大家分享。
本文涉及以下技術:javascript、ActiveX、ASP.NET、GDI+。
二.基本架構
首先,我們不能使用IE的列印功能,必須自己設計‘列印’按鈕。很多人習慣將‘列印’按鈕放在要列印的頁面上,列印時為了不把這個按鈕列印出來,採用辦法如下:1.列印前隱藏按鈕;2.列印;3.顯示按鈕。
我覺得這樣比較麻煩,所以我採用架構。一共有三個頁面:
1.main.htm :架構頁面,上面是列印按鈕,下面是要顯示的頁面。
2.header.htm :標題列,至少包含一個列印按鈕。
3.report.aspx :要列印的頁面,由使用者產生。
//main.htm
<html>
<head>
<title></title>
</head>
<frameset rows="10%,90%" frameborder="0" border="0" frameSpacing="0">
<frame id="header" name="header" src="Header.htm" noresize scrolling="no">
<frame id="report" name="report" src="Report.aspx" noresize scrolling="auto">
</frameset>
</html>
//header.htm
<html>
<head>
<script id=clientEventHandlersJS language=javascript>
<!--
function btnPrint_onclick()
{
parent.report.focus();
parent.report.print();
}
//-->
</script>
</head>
<body>
<INPUT id="btnPrint" type="button" value="Print" name="Print" onclick="return btnPrint_onclick()">
</body>
</html>
這樣,在點擊‘列印’按鈕時,將直接列印report.aspx頁面的內容,既簡單又直觀。
三.列印
要完全控制列印,就必須由程式設定頁首、頁尾、頁面邊界。每個用戶端的IE設定都不盡相同,你可以要求你的客戶修改他們的列印設定為你指定的值,顯然這不現實。所以正確的做法是:
1.備份客戶列印版面設定;
2.設定頁首頁尾上下左右邊距為自己需要的值;
3.列印;
4.恢複原來的列印版面設定。
這裡用到一個叫ScriptX的控制項。你需要下載一個檔案:smsx.cab,下載地址:http://www.meadroid.com/scriptx/sxdownload.asp。這個地址並不能保證長期有效,你可以在搜尋引擎上搜尋‘ScriptX’以獲得更多相關資訊。
在“header.htm”中增加該控制項的引用:
<OBJECT id="factory" style="DISPLAY: none" codeBase="http://localhost/WebApplication1/smsx.cab#VVersion=6,3,434,12"
classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" viewastext>