js代碼
-------------------------------------------一 基于web的打印方案比較分析-------------------------------- 基于web的套打,難度在于要將瀏覽器中呈現(xiàn)的html,精確地打印到票據(jù)中,而且能夠?qū)崿F(xiàn)對分頁位置的控制。下面就ie瀏覽器所能采用的套打解決方案,來個匯總分析,希望對大家有所幫助。 一、瀏覽器的打印功能菜單 這種方案的優(yōu)勢是不需要對瀏覽器作任何擴(kuò)充,是最簡單的辦法,但問題也最多,如: 不能精確分頁。瀏覽器一般是根據(jù)用戶設(shè)置的頁面大小,web頁面的內(nèi)容多少,來自行決定分頁位置,程序員很難控制。會有頁腳頁眉干擾。 不能準(zhǔn)確對齊邊邊距及打印文字。 不能解決連續(xù)打印。比如,不是僅打印一張票據(jù),而是連續(xù)一次打印若干個票據(jù)。 二、使用webbrowser控件+ javascript 這實際上,是瀏覽器打印功能菜單的一種程序調(diào)用,與打印功能菜單沒什么兩樣。分頁的問題仍然存在,只不過,可以讓用戶不用去點菜單,直接在網(wǎng)頁中的一個按鈕,或一個鏈接里面調(diào)用罷了。 三 、使用print css 這是一種最理想的實現(xiàn)web套打的方法。這種方法通過在html文檔中,嵌入打印相關(guān)的css樣式,來實現(xiàn)對html文檔輸出打印的控制,比如設(shè)置紙張大小,紙張縱橫方向,打印邊距,分頁等。顯而易見,這種方式成本小,不需要下載任何插件,而且跨平臺性非常好。print css推出已經(jīng)有些時日,但遺憾的是,至今沒有一個廠商的瀏覽器很好地實現(xiàn)了這些標(biāo)準(zhǔn),這使得程序員目前還不能利用print css進(jìn)行實際的開發(fā)。關(guān)于打印css,參見http://css-discuss.incutio.com/?page=printstylesheets 四 、使用pdf文件 用這種方式,就是從服務(wù)器端下載一個pdf文件流,在ie中用adobe插件打開,然后用adobe的打印菜單進(jìn)行打印,雖然這種方案,也能實現(xiàn)精確套打,但需要下載adobe插件。這是國外報表工具經(jīng)常推薦的一種打印方法,但在pdf不那么普及的中國,這種方案不是最好選擇。 五 、采用純activex 這種方案就是下載一個控件,票據(jù)的數(shù)據(jù)不再以html方式呈現(xiàn),而是呈現(xiàn)在activex中。這種方案的優(yōu)點是打印的精確度高,分頁的可控性好,但缺點也是很明顯的,嵌入activex控件破壞了web應(yīng)用的整體html風(fēng)格,且這樣的控件比較大(一般超過1m),下載頗費(fèi)時間)。市場上的非java類報表產(chǎn)品,一般都采用這種方案。 六 、采用applet方式 采用applet方式,分頁或精確打印,都可以做到完美,但缺點也很明顯,表現(xiàn)在: 安裝applet成本巨大。需要下載十幾m的文件。 打印報表時,需要重新向服務(wù)器檢索數(shù)據(jù),效率低。因為applet方案,一般采用html方式呈現(xiàn)數(shù)據(jù),打印時applet必須向服務(wù)器檢索同一張票據(jù)的數(shù)據(jù),看上去,是打印了當(dāng)前頁的票據(jù),實際上,applet根本不會用當(dāng)前html頁的數(shù)據(jù)來打印,而是向服務(wù)器下載數(shù)據(jù)到applet中來打印。也就是說,打印的話,必須兩次請求,一次html呈現(xiàn),一次用來打印。 不能解決連續(xù)打印。比如,不是僅打印一張票據(jù),而是連續(xù)一次打印若干個票據(jù)。 不能解決打印機(jī)設(shè)置問題,如存在多臺打印機(jī)時,總是需要手工選擇,打印到哪一臺打印機(jī)。 市場上java類的報表工具,一般推薦applet方式來實現(xiàn)打印。 七 、輕量級的activex打印方式 -----scriptx----- scriptx的免費(fèi)版本好點,已經(jīng)能滿足大部分的需求. meadco's scriptx控件有兩種使用方式,一種是做為免費(fèi)版本使用,一種是做為收費(fèi)版本使用,免費(fèi)版本支持的功能要少些,不過最重要也是最常用的頁面設(shè)置,它還是提供的,因此使用免費(fèi)版本即可。不過這兩個版本用的都是同一個cab文件,只不過在代碼設(shè)置中有一些不同。 -----pazu (四方)----- pazu 個人或者商業(yè)使用均真正免費(fèi)授權(quán),無ip或者域名限制。 pazu自2009年6月起采用免費(fèi)的許可,申請時,您必須有確定的ip地址或者域名(主機(jī)名),pazu是綁定ip或者域名的,ip或域名尚未確定的我們不能頒發(fā)授權(quán),另外,授權(quán)一經(jīng)頒發(fā)就不能修改綁定。 綁定的ip和域名必須是最終用戶的,所以,最終用戶的應(yīng)用網(wǎng)站必須和4fang網(wǎng)站做好鏈接,否則 pazu會因為無法驗證授權(quán)的合法性而不能正常工作(內(nèi)網(wǎng)應(yīng)用除外)。 企業(yè)可以購買開發(fā)集成版(適合項目集成或者產(chǎn)品開發(fā)公司,提供keygen工具,自己生成許可授權(quán),不限制發(fā)行) -----jatoolsprinter(杰表.打印控件)----- 免費(fèi)版本只能在192.168.*** 網(wǎng)段使用,2.0之前的版本有免費(fèi)版本,2.0之后是收費(fèi)的。目前最新版本是4.2.他們可以通過web腳本來選擇輸出打印機(jī),紙張大小,打印方向等,不必每次手工設(shè)定。 價格請看:http://jatools.com/print/howtobuy.htm 對于簡單的打印,我們用ie的功能就可以了,對于需要復(fù)雜的設(shè)置的,建議使用輕量級的activex打印方式。在接下來的系列教程里,我們會一一介紹。 ---------------------------------------二 使用ie的打印功能進(jìn)行一般的網(wǎng)頁打印----------------------------- 在我們進(jìn)行web開發(fā)的時候,通常會需要用到打印,然而,由于web技術(shù)的限制及考慮到安全的問題,一直以來,web打印的功能都是非常弱的,對此,我們也只能接受。也許你在開發(fā)過程中經(jīng)常會遇見客戶對你說,“你們系統(tǒng)的打印太差了,你看看excel的打印多好啊,”,面對這樣的用戶,我們除了苦笑,還能說什么呢?如果你對著他們?nèi)ソ忉屖裁词莃s架構(gòu),什么是cs架構(gòu),不但不能夠解決問題,反而會招致用戶的反感。 那么,我們是不是就什么都不能做了呢?答案當(dāng)然是否定的。利用現(xiàn)有的web技術(shù),再加上針對求的靈活實現(xiàn),我們也可以做出漂亮的打印出來。 在接下來的幾篇文章里,我將分別介紹幾種打印的方法或技術(shù)。這些方法有的很簡單,有的稍微復(fù)雜一點。我們還是從基礎(chǔ)做起,先了解最簡單的打印技術(shù),然后再一步一步提高,這樣也有利于消化技術(shù)。 本篇內(nèi)容講述利用ie提供的簡單的打印功能,進(jìn)行打印的設(shè)置以及打印。 在ie里打印,我們可以通過javascript來調(diào)用window.print()函數(shù)實現(xiàn)。下面是一個簡單的代碼示例。
java代碼
'button' value=
'打印' onclick=
'javascript:window.print()' />
點擊“打印”后,即可彈出打印窗口,如下圖
通過這個函數(shù),可以實現(xiàn)最簡單的打印功能。如果我們要對紙張,頁邊距進(jìn)行設(shè)置,那該怎么做呢? 我們知道,我們可以方便地通過 internet explorer 用戶界面更改頁邊距、頁眉和頁腳設(shè)置和默認(rèn) internet explorer 打印機(jī),ie也提供了一個叫webbrowser 控件來供我們調(diào)用,通過調(diào)用,可以在頁面上調(diào)出打印的設(shè)置窗口,在設(shè)置窗口里,用戶可以更改頁邊距、頁眉和頁腳設(shè)置等。(但是,在 internet explorer 或 webbrowser 控件下沒有以編程方式更改這些設(shè)置的方法。在本系列教程的第三篇,我將介紹如何在頁面上通過編程的方式來更改設(shè)置。)我們可以在頁面上輸入如下代碼來調(diào)用webbrowser 控件。
java代碼
"clsid:8856f961-340a-11d0-a96b-00c04fd705a2" id=wb name=wb >
'button' value=
'打印' onclick=
'javascript:wb.execwb(6,1)' />
'button' value=
'打印預(yù)覽' onclick=
'javascript:wb.execwb(7,1)' />
'button' value=
'頁面設(shè)置' onclick=
'javascript:wb.execwb(8,1)' />
上例中的object就是ie提供的打印控件,叫webbrowser,我們在網(wǎng)頁中可以用我們設(shè)置的id或name來引用它。 這個對象有很用法,其中涉及到打印的有下面三項。 wb.execwb(6,1) 打印 wb.execwb(7,1) 打印預(yù)覽 wb.execwb(8,1) 打印頁面設(shè)置 點擊“打印”按鈕,即可彈出和window.print()函數(shù)一樣的窗口。 點擊打印預(yù)覽,即可預(yù)覽當(dāng)前頁面。
點擊“頁面設(shè)置”,即可彈出頁面設(shè)置窗口,在設(shè)置窗口里,可以對邊距,頁眉等進(jìn)行詳細(xì)設(shè)置。
通過以上三個功能,我們就可以進(jìn)行簡單的打印和設(shè)置了,對于一般的打印需求來說基本足夠。 這里需要說明的是,“頁面設(shè)置”中的各個值,是存儲在用戶的注冊表中。 下面是 microsoft internet explorer 訪問打印設(shè)置的方式: 對于頁邊距,microsoft internet explorer 首先嘗試從以下注冊表項中獲取值:
java代碼
hkey_current_usersoftwaremicrosoftinternet explorerpagesetup hkey_current_usersoftwaremicrosoftinternet explorerpagesetup
如果沒有此項,internet explorer 將通過從以下注冊表項中復(fù)制值來創(chuàng)建此項:
java代碼
hkey_local_machinesoftwaremicrosoftinternet explorerpagesetup hkey_local_machinesoftwaremicrosoftinternet explorerpagesetup
如果沒有此項,將提供默認(rèn)值。 對于頁眉和頁腳,將從以下項中獲取值:
java代碼
hkey_current_usersoftwaremicrosoftinternet explorerpagesetup hkey_current_usersoftwaremicrosoftinternet explorerpagesetup
如果沒有此項,將提供默認(rèn)值。 頁邊距的默認(rèn)值是 0.75, 對于 internet explorer 默認(rèn)打印機(jī),默認(rèn)值將從以下項提供:
java代碼
hkey_current_usersoftwaremicrosoftinternet explorerpagesetupprinter hkey_current_usersoftwaremicrosoftinternet explorerpagesetupprinter
請注意,這些值作用于整個系統(tǒng),影響著當(dāng)前用戶的 webbrowser 控件和 internet explorer 的所有實例。因此,如果你設(shè)置了第一張網(wǎng)頁的頁眉是“ajava.org”,那么第二張網(wǎng)頁的頁眉也是它。 那么,有沒有一種辦法,能夠在程序里對這些選項進(jìn)行設(shè)置,而不需要用戶每次都手工來設(shè)置呢?請看下面. ------------------------------------三 使用wscript.shell通過編程方式進(jìn)行復(fù)雜的web打印設(shè)置----------------------------- 上篇文章介紹了如何進(jìn)行簡單的打印和設(shè)置,適用與一般的打印要求,如互聯(lián)網(wǎng)上網(wǎng)站的打印。然而,在我們?yōu)檎蚱髽I(yè)開發(fā)系統(tǒng)時,打印需求較為復(fù)雜,一般的打印設(shè)置可能滿足不了用戶需求,特別是為了用戶良好的可操作性,不能要求用戶在打印時都手工進(jìn)行打印設(shè)置,這時,就需要我們在程序里實現(xiàn)對打印的預(yù)設(shè)置,用戶只需要點擊打印就可以了。 那么如何實現(xiàn)可編程的打印設(shè)置呢?有很多種方法,本文將介紹wscript.shell來進(jìn)行打印設(shè)置。 使用wscript.shell,必須要求客戶ie允許 activex進(jìn)行交互。如果是你開發(fā)的系統(tǒng)是針對于特定的用戶群,如一個政府單位,或一個企業(yè),那么建議你要求客戶將你的系統(tǒng)加入可信任站點。 從《[ajava原創(chuàng)]web打印系列教程之二--使用ie的打印功能進(jìn)行一般的網(wǎng)頁打印》一文中,我們知道,頁邊距,頁眉,頁腳是存儲在注冊表里的。因此,接下來,我們主要是針對注冊表進(jìn)行可編程設(shè)置。 請看如下代碼。
js代碼
ajava.orgweb打印系列教程
ajava.orgweb打印系列教程
面的代碼是本道寫的一個簡單的函數(shù),它可以對header(頁眉),footer(頁腳),margin_bottom(下邊距),margin_left(左邊距),margin_right(右邊距),margin_top(上邊距)進(jìn)行設(shè)置。 如果你想對一個要打印的網(wǎng)頁通過編程方式進(jìn)行以上設(shè)置,只需要調(diào)用pagesetup即可。例如:
如果你沒有把站點加到可信任站點,那么在執(zhí)行上面的代碼時,可能會彈出一個對話框。如下。
圖片1
選擇“是”,程序即對打印進(jìn)行了設(shè)置。如果你打開頁面設(shè)置窗口,你會發(fā)現(xiàn),頁眉,頁腳,已經(jīng)被修改了。
圖片1
對于頁邊距的值,你只需要根據(jù)你自己的版面要求進(jìn)行設(shè)置成相關(guān)的值就可以了。下面主要講一下頁眉頁腳的詳細(xì)值?!⊥ǔN覀儠陧撁技由暇W(wǎng)頁的標(biāo)題,在頁腳加上頁面代碼,日期等等,我們該如何設(shè)置呢?
下面就是可供我們使用的一些項目及值。
鍵入 要打印
&w 窗口標(biāo)題
&u 網(wǎng)頁地址 (url)
&d 短日期格式(由“控制面板”中的“區(qū)域設(shè)置”指定)
&d 長日期格式(由“控制面板”中的“區(qū)域設(shè)置”指定)
&t 由“控制面板”中的“區(qū)域設(shè)置”指定的時間格式
&t 24 小時時間格式
&p 當(dāng)前頁號
&p 網(wǎng)頁總數(shù)
&& 單個 & 號 (&)
&b 緊跟在這些字符之后的文本居中打印。
&b&b 緊跟在第一個 "&b" 之后的文本居中打印,跟在第二個 "&b" 之后的文本按右對齊方式打印。
光看這些說明可能有些不直觀,我們還是來點例子吧。
運(yùn)行后頁眉如下圖。
圖片1
頁腳如下圖。
圖片看不清楚?請點擊這里查看原圖(大圖)。
圖片1
對于其他的參數(shù)都很好理解,這里我只解釋一下如何居左,居中,居右。
要想居中,使用“&b”,緊跟在這些字符之后的文本居中打印。例如“&b教程”,那么“教程”就會居中。
要想居右,就在居中的后面再加上“&b”。例如“&b教程&b打印系列”,那么“教程”就會居中,打印系列就會居右。
如果你不想居中,只要居右,“&b&b打印系列”這樣就可以了。
第一個“&b”前面的文字都是居左。
通過wscript.shell的使用,我們已經(jīng)可以通過編程方式進(jìn)行打印設(shè)置了,應(yīng)該說,普通的打印需求都可以實現(xiàn)了。但是,在日常的打印里,還有一種特色的需求,那就是分頁,對于分頁打印,我們該如何實現(xiàn)呢?請看《[ajava原創(chuàng)]web打印系列教程之四--簡單的web打印分頁設(shè)置》
在講述如何分頁打印之前,我們有必要先了解一下css中不為人知的一些用法。
css里media的使用
我們在網(wǎng)頁里引用外部的css文件時,通常是用如下的代碼:
實際上,上面的link對象里,我們是省略了一個叫“media”的屬性,這個屬性指定樣式表規(guī)則用于指定的設(shè)備類型。它有如下值可用:
all-- 用于所有設(shè)備類型
aural-- 用于語音和音樂合成器
braille-- 用于觸覺反饋設(shè)備
embossed-- 用于凸點字符(盲文)印刷設(shè)備
handheld-- 用于小型或手提設(shè)備
print-- 用于打印機(jī)
projection-- 用于投影圖像,如幻燈片
screen-- 用于計算機(jī)顯示器
tty-- 用于使用固定間距字符格的設(shè)備。如電傳打字機(jī)和終端
tv-- 用于電視類設(shè)備
這么多的值,并不是每個都可用,因為瀏覽器廠商并沒有全部實現(xiàn)它們。
在ie里面,可用的值有all,print,screen三個。上面的代碼里,我們沒有使用“media”,實際上ie或其他瀏覽器是用了“all”這個值?!皊creen”,用于顯示器,也就是我們一般看到的效果?!皃rint”,用于打印的效果。
也就是說,我們沒有指定“media”,那么我們看到的效果和打印的效果,它們用的都是同樣的css文件。如果我們指定了一個“screen”,又指定了一個“print”,那么在打印時就會用“print”指定的css來渲染網(wǎng)頁并打印。例如一個網(wǎng)頁里有如下代碼:
那就表示,我們通過ie看到的網(wǎng)頁,用到的css文件是mycss.css,而通過ie打印時用到的css文件則是myprintcss.css。想到什么了嗎?對,我們可以通過print的設(shè)置,來讓網(wǎng)頁上的一些不需要打印的內(nèi)容隱藏起來,比如,打印按鈕。實際上,media還可以這樣使用:
或者這樣使用:
css里用于打印的屬性
page-break-after : auto | always | avoid | left | right | null
參數(shù):
auto : 假如需要在對象之后插入頁分割符
always :始終在對象之后插入頁分割符
avoid : 避免在對象后面插入頁分割符
left : 在對象后面插入頁分割符直到它到達(dá)一個空白的左頁邊
right :在對象后面插入頁分割符直到它到達(dá)一個空白的右頁邊
null : 空值。ie5用來取消頁分割符設(shè)置
這個page-break-after,主要用來在打印時插入一個分頁符,分頁就靠它了。它還有個雙胞胎的兄弟,叫page-break-before,參數(shù)和它一樣,看名字即知道它是用來在對象之前插入分頁符。
示例
在理解了以上兩個css用法后,下面通過一個示例來說明如何分頁。
ajava.org書城訂單明細(xì)
ajava.org書城訂單明細(xì) 書名 價格 送貨地址 送貨時間 狀態(tài) 《java 編程思想》 ¥60.00 伊拉克巴格達(dá)總統(tǒng)府9棟8單元7門654室 2009-8-8 已送達(dá) 該文章在 2010/7/9 23:09:22 編輯過