做管理系統(tǒng)的時(shí)候,打印一直是個(gè)棘手的問題,做B/S的系統(tǒng)這個(gè)問題就更加突出了!下面舉出三種常用的web打印處理方式
1、利用word或者excel來實(shí)現(xiàn)web打印(如果不修改ie設(shè)置,可以在web服務(wù)器端生成xls文件,然后通過xlBook = xls.Workbooks.Open(remotePath) 獲取對象打印)
實(shí)現(xiàn)過程:先將需要打印的數(shù)據(jù)導(dǎo)入到word或者excel中,再利用word或者excel的打印功能來實(shí)現(xiàn)web打印。
下面以excel為例實(shí)現(xiàn)如何打印的過程
將網(wǎng)頁中數(shù)據(jù)導(dǎo)入excel中的方法有很多,這里先介紹一種,利用ActiveX控件的方式,即 Excel.Application, 這個(gè)控件是MS為excel提供的編程接口,在很多種編程語言種都可以通過該接口來操縱excel表格。
下面用javascript腳本來實(shí)現(xiàn)一個(gè)簡單的例子。
< script language="javascript">
function ExcelPrint(){
var excelApp;//存放Excel對象
var excelBook;//存放Excel工件簿文件
var excelSheet;//存放Excel活動(dòng)工作表
try{
excelApp = new ActiveXObject("Excel. Application");//創(chuàng)建Excel對象}
catch(e){
alert("請啟用ActiveX控件設(shè)置!");
return;}
excelBook = excelApp.Workbooks.Add();//創(chuàng)建Excel工作簿文件
excelSheet = excelBook.ActiveSheet;//激活Excel工作表
var rowLen = printTable.rows.length;//table對象的行數(shù)
for (var i=0;i< rowLen;i++){
var colLen = printTable.rows(i).cells.length;//table對象的列數(shù)
for (var j=0;j< colLen;j++)//為Excel表的單元格賦值
excelSheet.Cells(i+1,j+1).value = printTable.rows(i).cells(j).innerText;} //將表格中的每個(gè)單元格的innerText導(dǎo)入到excel的單元格中
excelApp.Visible = true;//設(shè)置Excel對象可見}
excelSheet.PrintOut(); //打印工作表
excelBook.Close(true); //關(guān)閉文檔
excelApp.Quit(); //結(jié)束excel對象
excelApp=null; //釋放excel對象
< /script>
注意:
運(yùn)行該程序的前提是 IE要允許對沒有標(biāo)記為安全的Activex控件進(jìn)行初始化和腳本運(yùn)行。設(shè)置方法如下:
打開控制面板→Internet選項(xiàng)→安全性→自定義級別→對沒有標(biāo)記為安全的ActiveX控件進(jìn)行初始化和腳本運(yùn)行→選中啟用,這樣我們的程序就可以運(yùn)行了。如果沒有啟用該ActiveX控件設(shè)置,那么程序在執(zhí)行創(chuàng)建Excel對象時(shí)會(huì)拋出一個(gè)異常,這時(shí)可以通過catch()語句來捕獲這個(gè)異常,并且做出相應(yīng)的處理。
運(yùn)行該程序必須客戶端安裝了MS EXCEL,否則Activex驅(qū)動(dòng)不了。
2、利用瀏覽器自帶的打印控件來實(shí)現(xiàn)web打印
實(shí)現(xiàn)過程:直接調(diào)用IE的打印功能或者在程序中調(diào)用window.print()來實(shí)現(xiàn)web打印,頁眉和頁腳會(huì)有網(wǎng)頁標(biāo)題、頁碼、網(wǎng)址,日期等信息,這些打印時(shí)如果不需要,怎樣能去掉呢。做法其實(shí)很簡單,只有在IE的文件菜單中打開頁碼設(shè)置對話框,去掉頁眉頁腳中設(shè)置的哪些信息,就可以了。但是這需要每個(gè)客戶端都去手動(dòng)設(shè)置一次。如果不想讓每個(gè)客戶端都手動(dòng)去設(shè)置一次,也可以用代碼通過修改注冊表的鍵值來實(shí)現(xiàn)。
下面是用VBScript來實(shí)現(xiàn)的修改注冊表的過程:
< script language="VBScript">
dim path, reg
'path存放IE打印設(shè)置的注冊表地址, reg存放WScript.Shell組件的對象
path = "HKEY_CURRENT_USER\Software\Micro-soft\Internet Explorer\PageSetup"
'通過注冊表修改打印設(shè)置,只修改頁眉、頁腳和各邊界的值
'參數(shù)說明:header--頁眉,footer--頁腳,margin_left--左邊界
'margin_top--上邊界,margin_right--右邊界,margin_bottom--下邊界
'頁邊距的設(shè)置中 1對應(yīng)25.4mm,即margin_left=1表示實(shí)際值的25.4mm
function pagesetup(header, footer, margin_left, margin_top, margin_right, margin_bottom)
On Error Resume Next
Set reg = CreateObject("WScript.Shell")
if err.Number>0 then
MsgBox "不能創(chuàng)建WScript.Shell對象!"
exit function
end if
reg.RegWrite path+"\header", header'設(shè)置頁眉
reg.RegWrite path+"\footer", footer '設(shè)置頁腳
reg.RegWrite path+"\margin_left", margin_left'設(shè)置左邊界
reg.RegWrite path+"\margin_top", margin_top'設(shè)置上邊界
reg.RegWrite path+"\margin_right", margin_right'設(shè)置右邊界
reg.RegWrite path+"\margin_bottom", margin_bottom'設(shè)置下邊界
end function
< /script>
還有一點(diǎn)需要注意的是,利用window.print()這樣的方法來打印,是直接彈出打印對話框,而不是打印預(yù)覽的窗口。一般來說用戶希望先打印預(yù)覽一下,然后再打印。或者有的格式固定的,每次都是一樣的格式,就希望不彈出打印對話框,直接就打印出來。
還有的用戶希望每個(gè)打印都是直接和一種紙張綁定好,打印時(shí)候直接就調(diào)用那種類型的紙張來打印,這樣window.print()顯然遠(yuǎn)遠(yuǎn)不夠。
3、利用第三方的控件或者報(bào)表軟件來實(shí)現(xiàn)web打印
實(shí)現(xiàn)過程:第三方控件將打印的參數(shù)和方法封裝成對象,在頁面中可以方便的直接調(diào)用,例如ScriptX.cab,eprint.cab 都是這種類型的控件。可以直接用代碼實(shí)現(xiàn)web打印頁眉頁腳的設(shè)置,web打印紙張的綁定,web打印邊距的設(shè)置,web打印預(yù)覽,直接web打印。
web打印格式設(shè)置,web打印分頁,web打印換頁重新打印某些信息,某些信息只能第一頁打印,某些信息只能最后一頁打印等等這些,也都解決方案。Scriptx沒有處理這些的方案,webprint有webgrid和eprint兩種解決方案,行列規(guī)則的表格式的可以簡單webgrid來處理,復(fù)雜格式的可以用eprint來設(shè)計(jì)格式。
一般這種類型的打印控件都是需要收費(fèi)的,用戶可以從經(jīng)濟(jì)的角度來考慮。
==========================================================================================================
一、 瀏覽器的打印功能菜單
這種方案的優(yōu)勢是不需要對瀏覽器作任何擴(kuò)充,是最簡單的辦法,但問題也最多,如:
- 不能精確分頁。
瀏覽器一般是根據(jù)用戶設(shè)置的頁面大小,web頁面的內(nèi)容多少,來自行決定分頁位置,程序員很難控制。會(huì)有頁腳頁眉干擾。
- 不能準(zhǔn)確對齊邊邊距及打印文字。
- 不能解決連續(xù)打印。
比如,不是僅打印一張票據(jù),而是連續(xù)一次打印若干個(gè)票據(jù)。
|
二、 使用webbrowser控件+ javascript
這實(shí)際上,是瀏覽器打印功能菜單的一種程序調(diào)用,與打印功能菜單沒什么兩樣。分頁的問題仍然存在,只不過,可以讓用戶不用去點(diǎn)菜單,直接在網(wǎng)頁中的一個(gè)按鈕,或一個(gè)鏈接里面調(diào)用罷了。
三、 使用print css
這是一種最理想的實(shí)現(xiàn)web套打的方法。這種方法通過在html文檔中,嵌入打印相關(guān)的css樣式,來實(shí)現(xiàn)對html文檔輸出打印的控制,比如設(shè)置紙張大小,紙張縱橫方向,打印邊距,分頁等。顯而易見,這種方式成本小,不需要下載任何插件,而且跨平臺性非常好。print css推出已經(jīng)有些時(shí)日,但遺憾的是,至今沒有一個(gè)廠商的瀏覽器很好地實(shí)現(xiàn)了這些標(biāo)準(zhǔn),這使得程序員目前還不能利用print css進(jìn)行實(shí)際的開發(fā)。關(guān)于打印css,參見:
http://css-discuss.incutio.com/?page=PrintStylesheets
四、 使用pdf文件
用這種方式,就是從服務(wù)器端下載一個(gè)pdf文件流,在IE中用adobe插件打開,然后用adobe的打印菜單進(jìn)行打印,雖然這種方案,也能實(shí)現(xiàn)精確套打,但需要下載adobe插件。這是國外報(bào)表工具經(jīng)常推薦的一種打印方法,但在pdf不那么普及的中國,這種方案不是最好選擇。
五、 采用純ActiveX
這種方案就是下載一個(gè)控件,票據(jù)的數(shù)據(jù)不再以html方式呈現(xiàn),而是呈現(xiàn)在ActiveX中。這種方案的優(yōu)點(diǎn)是打印的精確度高,分頁的可控性好,但缺點(diǎn)也是很明顯的,嵌入ActiveX控件破壞了web應(yīng)用的整體html風(fēng)格,且這樣的控件比較大(一般超過1M,下載頗費(fèi)時(shí)間)。市場上的非java類報(bào)表產(chǎn)品,一般都采用這種方案。
六、 采用Applet方式
采用Applet方式,分頁或精確打印,都可以做到完美,但缺點(diǎn)也很明顯,表現(xiàn)在:
- 安裝Applet成本巨大。需要下載十幾M的文件。
Applet本身可能并不大,但運(yùn)行Applet所需的jre一般至少10幾M(jre1.4.2 , 15.45M)。用戶需要極大的耐心,來進(jìn)行打印。
- 打印報(bào)表時(shí),需要重新向服務(wù)器檢索數(shù)據(jù),效率低。
因?yàn)锳pplet方案,一般采用html方式呈現(xiàn)數(shù)據(jù),打印時(shí)Applet必須向服務(wù)器檢索同一張票據(jù)的數(shù)據(jù),看上去,是打印了當(dāng)前頁的票據(jù),實(shí)際上,Applet根本不會(huì)用當(dāng)前html頁的數(shù)據(jù)來打印,而是向服務(wù)器下載數(shù)據(jù)到Applet中來打印。也就是說,打印的話,必須兩次請求,一次html呈現(xiàn),一次用來打印。
市場上java類的報(bào)表工具,一般推薦Applet方式來實(shí)現(xiàn)打印。
|
七、 輕量級的ActiveX打印方式
這是本公司應(yīng)客戶要求,最新推出的一種最具創(chuàng)意的web套打解決方案。
杰表作為一款純java的報(bào)表工具,以前提供的web套打方案也是基于Applet的,Applet也做到了盡可能的小(只有24kb),但用戶還是抱怨,因?yàn)閖re太大,安裝需要耐心。另外,用Applet方式,很難實(shí)現(xiàn)客戶端的批量打印功能。
我們采用輕量級的ActiveX打印方案,很好地解決了客戶的問題。以下是一個(gè)典型的該種方案的示例
posted on 2009-02-25 13:44
歲月如歌 閱讀(91042)
評論(22) 編輯 收藏 所屬分類:
js