web打印一直是web管理系統的難點,事實證明,采用輕量級的dll控件來實現web打印,是比較理想的解決方案。
采用vc的ATL技術,結合IE的打印模版技術編寫的webprint.dll,壓縮打包生成dll後,文件下載只有80k左右,是輕量級的打印控件。最近主要實現了如下功能:
1、dll插件的功能修改
1.1增加打印url的屬性
描述:當設置這個屬性的值為一個url鏈接,然後再調用Print()函數做打印,就可以將url鏈接到的網頁打印出來。
語法: webprint.printURL=[StringValue];
Webprint.Print(); 或 webprint.preview();
應用於:webprint對象
使用舉例:
Webprint.InitPrint();
Webprint.printURL=”http://www.fcsoft.com.cn”;
Webprint.Preview(); //會查看到鏈接到的頁面
注意:webprint是打印小插件的id.
1.2增加打印完成的狀態屬性
描述:當調用dll控件做打印文檔的時候,文檔處理完成,成功發送給打印機處理的時候,這個時候,此狀態值會變成”over”;即用戶在做打印文檔的時候,可以通過回調判斷這個屬性的值來判斷文檔是否打印完成。
語法:webprint.state
使用舉例:
Webprint.InitPrint();
Webprint.Print();
……此處需要使用回調來判斷是否打印完成。
If (webprint.state==”over”){
Alert(“打印完成!”);
}
注意:webprint是打印小插件的id
1.3打印預覽界面圖片顯示
原來:調用windows系統目錄中的圖片,當系統在vista上運行時,不能正常顯示。
修改後:圖片修改成獨立調用的圖片,在vista和windows系統上均可以正常顯示。
1.4 頁邊距的設置
原來:在windows系統中設置頁邊距正常,在vista操作系統上設置會有問題
修改後:四個頁邊距在windows和vista上設置都沒有問題。
1.5 出現無權限問題 :
原來:點擊直接打印,後快速點 打印預覽,會出現腳本錯誤,無權限。
修改後:沒有這個現象了。
1.6 點擊預覽頁面窗口的關閉後window.close()失效的問題
原來:在預覽 頁面直接點窗口 的關閉,然後頁面的window.close()腳本運行會失效。
修改後:修改了這個問題。
1.7一次打印多份文檔方式
利用在頁面隱藏幀的方式,每個幀裡面加載不同的頁面,做一次點擊打印多份文檔的方式。
1.8打印預覽或打印會出現安全問題提示
原來:提示信息為“該頁包含潛在的安全隱患,是否繼續”
修改後:不再出現此提示。
2、eprint自定義打印工具的升級
2.1 只首頁打印,尾頁打印,循環頁打印
增加了只首頁打印,只尾頁打印,每頁均打印的功能。例如有的文檔標題只需要第一頁打印,換頁後不需要打印標題;有的只尾頁需要打印一些落款或簽名信息,其它頁均不需要打印;有的需要每頁都打印。
Webprint4.2中eprint自定義打印工具實現了此功能
設置界面:
在ep_band的屬性中,增加打印設置選擇項目:
首頁打印
每頁都打印
尾頁打印
如下圖所示
設置完成後,在相應的ep_band上放置的信息,就會按照預設置的方式來打印。
2.2 利用eprint一次打印多個模版的示例
利用webprint.dll的printState屬性(打印完成後的狀態)來做一次打印多份eprint模版的功能。
在實例頁面中加如下代碼,
//start 一次打印多份模版,將需要打印的模版名放到arr[]中********************************
var arr = new Array();
arr[0]= "sample001";
arr[1]= "sample002";
arr[2]= "sample003";
arr[3]= "sample004";
arr[4]= "sample005";
var iTime=0;
var iframeName = "_print_iframe";
function PrintAll(){
printNextJob(0);
}
function printNextJob(index){
if(iTime == 0 || window.frames(iframeName).oPrintCtl.printState == "over"){
if(iTime != 0) window.clearInterval(iTime);
if(index>=arr.length) {alert("打印完成!"); return;}
Printer.Print(arr[index],true);
document.getElementById(iframeName).onreadystatechange= function () {
if(document.getElementById(iframeName).readyState != "complete") return;
window.frames(iframeName).oPrintCtl.printState ="start";
iTime = window.setInterval("printNextJob("+(index+1)+")",500);
}
}
}
//end****************************************************************
調用printAll();函數後,就可以點擊一次,打印5份模版對應的文檔。
修改arr[n]=xxx; 達到打印各種不同模版的文檔。
實例代碼在:eprint for java\samples\samples.htm 頁面 點擊 一次打印多個
eprint for dotnet\samples\samples.htm 頁面 點擊 一次打印多個