【轉】【推廣+說(shuō)明】網(wǎng)頁(yè)打印第三方控件(轉載)
1. 入門(mén)基礎
PAZU 是一個(gè)ActiveX組件(NP版本是一個(gè)Plugin),本文檔只討論ActiveX版本(IE內核瀏覽器適用),NP版本的說(shuō)明文檔我們將另文發(fā)布。
PAZU 是一個(gè)已經(jīng)通過(guò)微軟代碼認證簽名的控件,用戶(hù)可以在使用到這個(gè)控件的時(shí)候會(huì )自動(dòng)提示安裝,保證發(fā)布的便利性。
在你的WEB頁(yè)里面使用<Object>標簽可以引用PAZU控件,如下:
<object classid="clsid:AF33188F-6656-4549-99A6-E394F0CE4EA4"
021yin.com/4ff/sc_setup.exe”
id="pazu"
name="pazu" >
<param name="License" value="You Need a License from 4Fang"/>
</object>
說(shuō)明:<object> 元素是用于嵌入ActiveX的,Flash也是通過(guò)這種方式嵌入到頁(yè)面里面的。
Classid里面的字符串是指向PAZU的專(zhuān)屬標識,是不能更改的。系統通過(guò)這個(gè)值檢索并載入PAZU控件
Codebase 是指向用戶(hù)可以下載到PAZU安裝包的網(wǎng)址,如果安裝包在你自己的網(wǎng)站上,你可以更改這個(gè)codebase屬性,使得用戶(hù)可以順利下載安裝PAZU控件。如果這個(gè)網(wǎng)址設置錯誤,IE將不會(huì )提示用戶(hù)下載安裝。
Id 屬性允許你通過(guò)javascript或者vbscript使用getElementById方法,獲得PAZU控件對象。
Name屬性和id屬性類(lèi)似
按我們的免費授權約定,您不應該也不允許更改id 和 name 的值。
Param 參數,必須有一個(gè)License 的屬性,value 是這個(gè)參數屬性的值。它的意義是4Fang的授權許可。
您可以向4Fang申請一個(gè)免費的授權,詳細的申請方法請看本文的許可授權章節,你要把你獲得的授權碼填入到Value值里面,PAZU才能正常工作。
注意:當你用提成免費許可申請。
2. 屬性和方法
PAZU內置兩個(gè)對象:TWin 和 TPrinter
PAZU這個(gè)對象結構的屬性和方法如下:
PAZU
|--------- TWin 對象
| |------------ appWin 方法 隱藏IE菜單、工具條、標題欄、狀態(tài)欄等
| |------------ MaxWin 方法 窗口最大化
| |------------ MinWin 方法 窗口最小化
| └----------- CloseWin 方法 關(guān)閉窗口
|--------- TPrinter 對象
| |------------ marginTop 屬性 上邊距
| |------------ marginBottom 屬性 下邊距
| |------------ marginLeft 屬性 左邊距
| |------------ marginRight 屬性 右邊距
| |------------ footer 屬性 頁(yè)腳
| |------------ header 屬性 頁(yè)眉
| |------------ orientation 屬性 整型:紙張方向 1=縱向 2=橫向
| |------------ paperName 屬性 紙張大小名稱(chēng)
| |------------ printerName 屬性 打印機名稱(chēng)
| |------------ isPrintBackground 屬性 是否打印背景 true / false
| |------------ isZoomOutToFit 屬性 是否縮放以適應大小打印 true / false
| |------------ printTemplate 屬性 打印模板的URL
| |------------ copies 屬性 打印份數
| |------------ range 屬性 頁(yè)面范圍
| |------------ isCopyByCopy 屬性 是否整份打印結束后再打印下一份 true / false
| |------------ getDefaultPrinter 方法 獲得默認打印機的對象
| |------------ printToDefaultPrinter 方法 把要打印的字符串輸送到默認打印機(配合getDefaultPrinter 使用)
| |------------ getPaperForms 方法 返回所有紙張格式的列表,以vbCrlf 分割
| |------------ getPrinters 方法 返回一個(gè)打印機列表,以vbCrlf 分割
| |------------ createPaper 方法 按指定的寬度和高度創(chuàng )建自定義紙張
| |------------ doPrint 方法 執行打印
| |------------ doPrint_ 方法 執行打印但是不進(jìn)行頁(yè)面參數設置
| |------------ doPreview 方法 打印預覽
| |------------ doPageSetup 方法 執行頁(yè)面參數的設置
| |------------ showPageSetup 方法 彈出頁(yè)面設置窗口
| |------------ writeHTMLtoOfficeFile 方法 把HTML導出為Office EXCEL或者 Word格式文件
| └----------- onlyPrintElementID 屬性(2012-1-2新增) 指定要打印的頁(yè)面元素的ID(IFrame也可),其他元素不會(huì )被打印
|--------- appWin 方法 舊版本兼容
|---------doPrint 方法 舊版本兼容
|--------- pageSetup 方法 舊版本兼容
|--------- Fly 方法 LAPUTAC平臺專(zhuān)用
|--------- Run 方法 LAPUTAC平臺專(zhuān)用
└-------- AddObj 方法 LAPUTAC平臺專(zhuān)用
版本20130423 添加一個(gè)新事件onafterpazuprint到window對象:
你可以使用以下語(yǔ)句來(lái)獲得打印完成事件的通知
window.onafterpazuprint= function(){
//添加你自己的處理代碼
特別地:
1. 此事件只在調用doPrint方法時(shí)而且isPromtUser參數為false時(shí)有效
如果彈出打印對話(huà)框則本事件不會(huì )觸發(fā).
2. 當IE在保護模式下工作(您的應用域名或者IP沒(méi)有在"信任區域"里面)時(shí), 本事件不會(huì )起作用
3. 請注意這個(gè)事件是被添加到 window 對象的, 而不是在PAZU對象中.
4. 本事件不代表物理打印過(guò)程已經(jīng)完成, 僅代表需要打印的內容已經(jīng)發(fā)送到操作系統的打印服務(wù). 最終打印是否成功是無(wú)從得知,也是不可控制的(例如打印過(guò)程卡紙了或者沒(méi)墨了而導致打印失敗)
3. TWin對象詳解
TWin 對象
|------------ appWin 方法 隱藏IE菜單、工具條、標題欄、狀態(tài)欄等,有一個(gè)bool的參數: appWin(true) appWin(false)
| 兩者的區別在于是否隱藏標題欄
|------------ MaxWin 方法 窗口最大化 MaxWin()
|------------ MinWin 方法 窗口最小化 MinWin()
└----------- CloseWin 方法 關(guān)閉窗口 CloseWin()
Javascript實(shí)例代碼:
//1.把IE窗口變成App窗口,不隱藏標題欄
pazu.TWin.appWin(false);
//2.把IE窗口變成App窗口,隱藏標題欄
pazu.TWin.appWin(true);
//3.最大化
pazu.TWin.MaxWin();
//4.最小化
pazu.TWin.MinWin();
//5.關(guān)閉窗口
pazu.TWin.CloseWin();
DEMO和實(shí)例網(wǎng)頁(yè)請看目錄下的pazu_twin.html
4. TPrinter對象詳解
DEMO和實(shí)例網(wǎng)頁(yè)請看目錄下的pazu_tprinter.html
marginTop 屬性 上邊距 數據類(lèi)型:數字 單位: 毫米
marginBottom 屬性 下邊距 數據類(lèi)型:數字 單位: 毫米
marginLeft 屬性 左邊距 數據類(lèi)型:數字 單位: 毫米
marginRight 屬性 右邊距 數據類(lèi)型:數字 單位: 毫米
例子:把上邊距設置為10mm
pazu.TPrinter. marginTop=10
footer 屬性 頁(yè)腳 數據類(lèi)型:字符串
header 屬性 頁(yè)眉 數據類(lèi)型:字符串
例子:設置頁(yè)眉
pazu.TPrinter.header=”這是新的頁(yè)眉”
要取消頁(yè)眉和頁(yè)腳,只要賦給它們一個(gè)空字符串就行了,例如不要頁(yè)眉:
pazu.TPrinter.header=””
同時(shí)頁(yè)眉和頁(yè)腳也支持左中右的對齊方式和自動(dòng)用日期、URL、頁(yè)碼等的填充。這方面的信息可以參考IE這方面的相關(guān)文檔
orientation 屬性 紙張方向 數據類(lèi)型:整數1或者2 , 1=縱向 2=橫向
例子:設置紙張方向為橫向
pazu.TPrinter. orientation=2
paperName 屬性 紙張大小名稱(chēng) 數據類(lèi)型:字符串
printerName 屬性 打印機名稱(chēng) 數據類(lèi)型:字符串
這兩個(gè)屬性我們都不要求完全匹配,可以采用左匹配的方式,舉例:
假設您有兩臺打印機,一臺是 Epson 1600K III ,一臺是 HP Deskjet 300。如果你要制定打印機為 HP Deskjet 300 你有兩種方式:
方式一:全匹配 pazu.TPrinter. printerName=” HP Deskjet 300”
方式二:左匹配 pazu.TPrinter. printerName=” HP”
紙張的大小也是一樣的道理,例如,指定用B5紙:
pazu.TPrinter. paperName=”B5”
提示:所有紙張格式和所有打印機的列表都可以通過(guò)pazu的相應方法取得,你還可以自定義紙張的大小。請看本文相應的章節。
isPrintBackground 屬性 是否打印背景 數據類(lèi)型:Boolean true / false
isZoomOutToFit 屬性 是否縮放以適應大小打印 數據類(lèi)型:Boolean true / false
printTemplate 屬性 打印模板的URL
copies 屬性 打印份數 數據類(lèi)型:整數,默認為1
range 屬性 頁(yè)面范圍 數據類(lèi)型:字符串
isCopyByCopy 屬性 是否整份打印結束后再打印下一份 數據類(lèi)型:Boolean true / false
說(shuō)明:
copies屬性允許你當前內容打印多份拷貝
range 你可以指定打印的頁(yè)面,例如:
只打印1到5頁(yè):pazu.TPrinter.range=”1-5”
只打印1,3,5,7頁(yè):pazu.TPrinter.range=”1,3,5,7”
提示:利用range屬性可以實(shí)現雙面打印功能
printTemplate屬性是打印模板的URL,詳細的內容請參考微軟的printTemplate技術(shù)的說(shuō)明。
getPrinters 方法 返回一個(gè)打印機列表,返回以一個(gè)回車(chē)換行符分隔的字符串
例如:獲得所有的打印機
var ps=pazu.TPrinter.getPrinters();
//獲得是一個(gè)以回車(chē)換行分隔的字符串
//alert(ps);
var pa=ps.split("\r\n");
for(var i=0;i<pa.length;i++){
alert(pa[i]);
getPaperForms 方法 返回所有紙張格式的列表,返回以一個(gè)回車(chē)換行符分隔的字符串
和getPrinters類(lèi)似,不同的是getPaperForms是帶參數的,你可以指定獲得那個(gè)打印機的紙張類(lèi)別,沒(méi)有參數或者參數為空字符表示獲得當前默認打印機的紙張列表
例如:var ps=pazu.TPrinter.getPaperForms(“HP deskjet 300”);
getDefaultPrinter 方法 獲得默認打印機的對象,返回一個(gè)Printer Object
printToDefaultPrinter 方法 把要打印的字符串輸送到默認打印機(配合getDefaultPrinter 使用),參數:字符串
通過(guò)返回的對象,你可以控制該打印機,調用該打印機的EndDoc等方法,來(lái)實(shí)現直接輸出內容到打印機
createPaper 方法 按指定的寬度和高度創(chuàng )建自定義紙張
有兩個(gè)參數,paperWidth 和 paperHeight ,參數類(lèi)型都是數字,單位是毫米。如果你指定的大小的紙張存在,則返回該紙張的名稱(chēng),如果不存在,就先創(chuàng )建新的紙張格式并放回新的格式名稱(chēng)
例如:strDefaultPaper=pazu.TPrinter.createPaper(200,140); //創(chuàng )建20cm*14cm的紙張格式
alert('成功創(chuàng )建紙張格式:'+strDefaultPaper);
doPrint 方法 執行打印
有一個(gè)Boolean的參數,該參數表示是否要彈出打印機選擇對話(huà)框
例如:不提示用戶(hù)直接打?。?/p>
pazu.TPrinter.doPrint(false)
doPrint_ 方法 執行打印但是不進(jìn)行頁(yè)面參數設置
和doPrint類(lèi)似,但是沒(méi)有參數,而且執行打印前不去進(jìn)行頁(yè)面參數的設置,也不提示用戶(hù)
doPreview 方法 打印預覽 沒(méi)有參數
doPageSetup 方法 執行頁(yè)面參數的設置 沒(méi)有參數
showPageSetup 方法 彈出頁(yè)面設置窗口 沒(méi)有參數
onlyPrintElementID 屬性(2012-1-2新增加) 用于指定打印或者預覽頁(yè)面內的某個(gè)ID的元素,可以是任意元素(IFRAME也可以),除此外的頁(yè)面上的其他內容將不會(huì )被打印。
如果是IFRAME,請注意:
A。請務(wù)必注意必須是用一個(gè)域內的網(wǎng)頁(yè),因為IE不允許跨域訪(fǎng)問(wèn)。
B。IFrame內的網(wǎng)頁(yè)和父頁(yè)面最好是同一個(gè)相對目錄,如果不是同一個(gè)目錄,則Iframe內的圖片引用請使用絕對路徑(或相對于跟目錄)的引用,否則可能無(wú)法正確打印該圖片
C。本屬性只在');協(xié)議)本屬性是無(wú)效的
D。使用完成后請最好重置本屬性值為空字符,以釋放資源。
5. 特殊應用
A. 打印指定的frame ,如果我們有多個(gè)iframe 或者frame ,我們想打印其中的某一個(gè),怎么辦?
方法一:在要打印的frame中嵌入PAZU,用戶(hù)在打印的時(shí)候,點(diǎn)擊該frame的打印按鈕
方法二:打印前先用javascript 讓要打印的frame獲得焦點(diǎn),再調用doPrint(false) 方法
例子:
window.frames['myifrm'].focus();
pazu.TPrinter.doPrint(false);
B.頁(yè)面載入的時(shí)候立即打印或者獲得打印機和紙張列表
你可以在<body>的onload事件里面完成你要的工作
C.同一個(gè)頁(yè)面里面,有些內容,如某個(gè)DIV或者按鈕我們不想打印出來(lái),但是屏幕上有需要顯示,怎么辦?
<!-- //設置某些頁(yè)面元素不打印,只要在該元素的樣式類(lèi)class里面添加一個(gè)p__就可以了,看myDIV的class-->
<div class="myDIVClass p__" id="myDIV">這個(gè)DIV和"打印試試"按鈕都不會(huì )被打印</div>
<input class="p__" name="Button1" type="button" value="打印試試!" onclick="demo();" style="width: 301px" />
D. 連續循環(huán)打???超多超大數據集的打???
這種應用有兩種實(shí)現方式,要具體看數據的多少。
1. 如果數據量不大(一個(gè)網(wǎng)頁(yè)可以把所有要打印的數據顯示出來(lái),雖然網(wǎng)頁(yè)要滾動(dòng)才能顯示,但是生成的HTML體積不大,而且用戶(hù)不需要等待太長(cháng)的時(shí)間來(lái)生成全部),如:一張出貨單,需要分開(kāi)多頁(yè)打印出來(lái)
這種情況可以在網(wǎng)頁(yè)要分頁(yè)的地方 插入 一個(gè)css樣式的分頁(yè),打印的時(shí)候就會(huì )自動(dòng)分頁(yè)打印了。我們的四方在線(xiàn)的憑證打印、賬簿的打印、單據的打印都是采用這種方式。
具體實(shí)現例子如下:
<!--以下三個(gè)div會(huì )自動(dòng)分成三頁(yè)打印-->
<div style="page-break-after:always"> 這是第一頁(yè)的內容 </div>
<div style="page-break-after:always"> 這是第二頁(yè)的內容 </div>
<div style=""> 這是第三頁(yè)的內容 </div>
2. 如果數據量大,或者程序設計上不能做到一個(gè)網(wǎng)頁(yè)把所有要打印的內容都容納進(jìn)來(lái), 例如要打印10萬(wàn)個(gè)客戶(hù)的賬單,賬單的數據在服務(wù)器的數據庫中
這種需求實(shí)際上是通過(guò)循環(huán)多次載入頁(yè)面實(shí)現的,你可以動(dòng)態(tài)載入動(dòng)態(tài)頁(yè)面來(lái)實(shí)現,在我們的四方在線(xiàn)軟件里面就有一個(gè)按月打印憑證的功能,就是這樣的一種應用方式。
具體實(shí)現如下:
//假設當前頁(yè)面為:thispage.jsp
//利用javascript ,打印完成后自己載入下一頁(yè)
//在頁(yè)面中引入PAZU打印控件后,參考一下javascript
window.onload=function(){
//先對頁(yè)面參數進(jìn)行設置
pazu.TPrinter.header="";
//其他設置,這里省略....
//執行打印,打印的時(shí)候注意不能預覽,也不能提示用戶(hù)選擇打印機,而是讓pazu直接輸出到打印機
pazu.TPrinter.doPrint(false);
//延遲一點(diǎn)時(shí)間,讓頁(yè)面重新載入下一頁(yè)
setTimer("printNextPage();",1000);
function printNextPage(){
window.location.href="thispage.jsp?pageid=NextPage";
6. 保留功能
pazu.TPrinter.writeHTMLtoOfficeFile 方法 把HTML導出為Office EXCEL或者 Word格式文件
這個(gè)函數可以把頁(yè)面直接“打印”為Office的EXCEL或者Word格式,該函數是PAZU為4Fang Laputac平臺所用,詳細的應用請參考LAPUTAC的文檔
PAZU
|--------- appWin 方法 舊版本兼容
|--------- doPrint 方法 舊版本兼容
|--------- pageSetup 方法 舊版本兼容
|--------- Fly 方法 LAPUTAC平臺專(zhuān)用
|--------- Run 方法 LAPUTAC平臺專(zhuān)用
└-------- AddObj 方法 LAPUTAC平臺專(zhuān)用 舊版本兼容
這些方法可以實(shí)現把程序從服務(wù)器端“漂移”到本地計算機運行,并且實(shí)現數據的本地存儲和訪(fǎng)問(wèn),也可以訪(fǎng)問(wèn)和存儲遠程服務(wù)器數據
7.特殊現象
021yin.com/apps/d4/Default.aspx?nodeid=4337
8. 微軟PrintTemplate技術(shù)
021yin.com/apps/d4/Default.aspx?nodeid=4355
例如:
假設我們有這樣的WEB打印需求:
某個(gè)WEB軟件工程項目中,生成的WEB頁(yè),WEB頁(yè)內容是動(dòng)態(tài)生成的,內容一般會(huì )很長(cháng),一頁(yè)紙肯定是打印不下的,那就必然要碰到分頁(yè)打印的問(wèn)題。
分頁(yè)打印有兩種實(shí)現方式:
1. 編程實(shí)現規范的分頁(yè),前提是我們知道應該在內容的什么地方按頁(yè)分割開(kāi),這種情況適合規范的表單、報表、帳頁(yè)等規范的內容。例如4Fang在線(xiàn)軟件里面的所有單據、賬簿和報表都是這樣的。
這種實(shí)現方式我們在前面的文章里面已經(jīng)有介紹,這里就不重復了。
2. 讓瀏覽器自動(dòng)分頁(yè),這種情況適合于大篇幅的文章等編程人員無(wú)法預知和計算應該在哪里分割開(kāi)的時(shí)候。
這種情況又可以細分為以下兩種情形:
2.1 沒(méi)有頁(yè)面頁(yè)腳,或者頁(yè)面頁(yè)腳為無(wú)格式純文本,這種情況很容易實(shí)現。直接指定頁(yè)面頁(yè)腳就可以了
2.2 頁(yè)眉頁(yè)腳需要插入圖形或者HTML、表格等,這種情況就比較復雜一點(diǎn),需要微軟的PrintTemplate技術(shù)了。
021yin.com/article/tech/pazu-pt-demo.htm
021yin.com/article/tech/pt-test.htm 您可以點(diǎn)擊查看這個(gè)網(wǎng)頁(yè),并查看它的源代碼。