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