<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    BlogJava 聯系 聚合 管理  

    Blog Stats

    隨筆檔案

    文章檔案


    gyl868

    做管理系統的時候,打印一直是個棘手的問題,做B/S的系統這個問題就更加突出了!下面舉出三種常用的web打印處理方式

    1、利用word或者excel來實現web打印(如果不修改ie設置,可以在web服務器端生成xls文件,然后通過xlBook = xls.Workbooks.Open(remotePath) 獲取對象打印

       實現過程:先將需要打印的數據導入到word或者excel中,再利用word或者excel的打印功能來實現web打印。
       下面以excel為例實現如何打印的過程
       將網頁中數據導入excel中的方法有很多,這里先介紹一種,利用ActiveX控件的方式,即 Excel.Application, 這個控件是MS為excel提供的編程接口,在很多種編程語言種都可以通過該接口來操縱excel表格。
       下面用javascript腳本來實現一個簡單的例子。
    < script language="javascript">

    function ExcelPrint(){

    var excelApp;//存放Excel對象

    var excelBook;//存放Excel工件簿文件

    var excelSheet;//存放Excel活動工作表

    try{

    excelApp = new ActiveXObject("Excel. Application");//創建Excel對象}

    catch(e){

    alert("請啟用ActiveX控件設置!");

    return;}

    excelBook = excelApp.Workbooks.Add();//創建Excel工作簿文件

    excelSheet = excelBook.ActiveSheet;//激活Excel工作表

    var rowLen = printTable.rows.length;//table對象的行數

    for (var i=0;i< rowLen;i++){

    var colLen = printTable.rows(i).cells.length;//table對象的列數

    for (var j=0;j< colLen;j++)//為Excel表的單元格賦值

    excelSheet.Cells(i+1,j+1).value = printTable.rows(i).cells(j).innerText;} //將表格中的每個單元格的innerText導入到excel的單元格中

    excelApp.Visible = true;//設置Excel對象可見}

    excelSheet.PrintOut(); //打印工作表

    excelBook.Close(true); //關閉文檔

    excelApp.Quit(); //結束excel對象

    excelApp=null;  //釋放excel對象

     

    < /script>
      
       注意:
       運行該程序的前提是 IE要允許對沒有標記為安全的Activex控件進行初始化和腳本運行。設置方法如下:
       打開控制面板→Internet選項→安全性→自定義級別→對沒有標記為安全的ActiveX控件進行初始化和腳本運行→選中啟用,這樣我們的程序就可以運行了。如果沒有啟用該ActiveX控件設置,那么程序在執行創建Excel對象時會拋出一個異常,這時可以通過catch()語句來捕獲這個異常,并且做出相應的處理。
       運行該程序必須客戶端安裝了MS EXCEL,否則Activex驅動不了。
      
      
      
    2、利用瀏覽器自帶的打印控件來實現web打印
       實現過程:直接調用IE的打印功能或者在程序中調用window.print()來實現web打印,頁眉和頁腳會有網頁標題、頁碼、網址,日期等信息,這些打印時如果不需要,怎樣能去掉呢。做法其實很簡單,只有在IE的文件菜單中打開頁碼設置對話框,去掉頁眉頁腳中設置的哪些信息,就可以了。但是這需要每個客戶端都去手動設置一次。如果不想讓每個客戶端都手動去設置一次,也可以用代碼通過修改注冊表的鍵值來實現。
       下面是用VBScript來實現的修改注冊表的過程:
       < script language="VBScript">

    dim path, reg

    'path存放IE打印設置的注冊表地址, reg存放WScript.Shell組件的對象

    path = "HKEY_CURRENT_USER\Software\Micro-soft\Internet Explorer\PageSetup"

    '通過注冊表修改打印設置,只修改頁眉、頁腳和各邊界的值

    '參數說明:header--頁眉,footer--頁腳,margin_left--左邊界

    'margin_top--上邊界,margin_right--右邊界,margin_bottom--下邊界

    '頁邊距的設置中 1對應25.4mm,即margin_left=1表示實際值的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 "不能創建WScript.Shell對象!"

    exit function

    end if

    reg.RegWrite path+"\header", header'設置頁眉

    reg.RegWrite path+"\footer", footer '設置頁腳

    reg.RegWrite path+"\margin_left", margin_left'設置左邊界

    reg.RegWrite path+"\margin_top", margin_top'設置上邊界

    reg.RegWrite path+"\margin_right", margin_right'設置右邊界

    reg.RegWrite path+"\margin_bottom", margin_bottom'設置下邊界

    end function

    < /script>

    還有一點需要注意的是,利用window.print()這樣的方法來打印,是直接彈出打印對話框,而不是打印預覽的窗口。一般來說用戶希望先打印預覽一下,然后再打印。或者有的格式固定的,每次都是一樣的格式,就希望不彈出打印對話框,直接就打印出來。
    還有的用戶希望每個打印都是直接和一種紙張綁定好,打印時候直接就調用那種類型的紙張來打印,這樣window.print()顯然遠遠不夠。


    3、利用第三方的控件或者報表軟件來實現web打印
       實現過程:第三方控件將打印的參數和方法封裝成對象,在頁面中可以方便的直接調用,例如ScriptX.cab,eprint.cab 都是這種類型的控件。可以直接用代碼實現web打印頁眉頁腳的設置,web打印紙張的綁定,web打印邊距的設置,web打印預覽,直接web打印。
       web打印格式設置,web打印分頁,web打印換頁重新打印某些信息,某些信息只能第一頁打印,某些信息只能最后一頁打印等等這些,也都解決方案。Scriptx沒有處理這些的方案,webprint有webgrid和eprint兩種解決方案,行列規則的表格式的可以簡單webgrid來處理,復雜格式的可以用eprint來設計格式。
      
       一般這種類型的打印控件都是需要收費的,用戶可以從經濟的角度來考慮。
    ==========================================================================================================

    一、 瀏覽器的打印功能菜單
    這種方案的優勢是不需要對瀏覽器作任何擴充,是最簡單的辦法,但問題也最多,如:
    1. 不能精確分頁。
      瀏覽器一般是根據用戶設置的頁面大小,web頁面的內容多少,來自行決定分頁位置,程序員很難控制。會有頁腳頁眉干擾。
    2. 不能準確對齊邊邊距及打印文字。
    3. 不能解決連續打印。
      比如,不是僅打印一張票據,而是連續一次打印若干個票據。
    二、 使用webbrowser控件+ javascript
    這實際上,是瀏覽器打印功能菜單的一種程序調用,與打印功能菜單沒什么兩樣。分頁的問題仍然存在,只不過,可以讓用戶不用去點菜單,直接在網頁中的一個按鈕,或一個鏈接里面調用罷了。

    三、 使用print css
    這是一種最理想的實現web套打的方法。這種方法通過在html文檔中,嵌入打印相關的css樣式,來實現對html文檔輸出打印的控制,比如設置紙張大小,紙張縱橫方向,打印邊距,分頁等。顯而易見,這種方式成本小,不需要下載任何插件,而且跨平臺性非常好。print css推出已經有些時日,但遺憾的是,至今沒有一個廠商的瀏覽器很好地實現了這些標準,這使得程序員目前還不能利用print css進行實際的開發。關于打印css,參見:
    http://css-discuss.incutio.com/?page=PrintStylesheets

    四、 使用pdf文件
    用這種方式,就是從服務器端下載一個pdf文件流,在IE中用adobe插件打開,然后用adobe的打印菜單進行打印,雖然這種方案,也能實現精確套打,但需要下載adobe插件。這是國外報表工具經常推薦的一種打印方法,但在pdf不那么普及的中國,這種方案不是最好選擇。

    五、 采用純ActiveX
    這種方案就是下載一個控件,票據的數據不再以html方式呈現,而是呈現在ActiveX中。這種方案的優點是打印的精確度高,分頁的可控性好,但缺點也是很明顯的,嵌入ActiveX控件破壞了web應用的整體html風格,且這樣的控件比較大(一般超過1M,下載頗費時間)。市場上的非java類報表產品,一般都采用這種方案。

    六、 采用Applet方式
    采用Applet方式,分頁或精確打印,都可以做到完美,但缺點也很明顯,表現在:

    1. 安裝Applet成本巨大。需要下載十幾M的文件。
      Applet本身可能并不大,但運行Applet所需的jre一般至少10幾M(jre1.4.2 , 15.45M)。用戶需要極大的耐心,來進行打印。
    2. 打印報表時,需要重新向服務器檢索數據,效率低。
      因為Applet方案,一般采用html方式呈現數據,打印時Applet必須向服務器檢索同一張票據的數據,看上去,是打印了當前頁的票據,實際上,Applet根本不會用當前html頁的數據來打印,而是向服務器下載數據到Applet中來打印。也就是說,打印的話,必須兩次請求,一次html呈現,一次用來打印。
      市場上java類的報表工具,一般推薦Applet方式來實現打印。
    七、 輕量級的ActiveX打印方式
    這是本公司應客戶要求,最新推出的一種最具創意的web套打解決方案。

    杰表作為一款純java的報表工具,以前提供的web套打方案也是基于Applet的,Applet也做到了盡可能的小(只有24kb),但用戶還是抱怨,因為jre太大,安裝需要耐心。另外,用Applet方式,很難實現客戶端的批量打印功能。
    我們采用輕量級的ActiveX打印方案,很好地解決了客戶的問題。以下是一個典型的該種方案的示例
    posted on 2009-09-27 11:24 gyl868 閱讀(211) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国外成人免费高清激情视频| 欧洲精品成人免费视频在线观看| 最近中文字幕免费大全| 免费a级毛片永久免费| 久久亚洲中文字幕无码| 任你躁在线精品免费| 亚洲中文字幕无码一区| 亚洲五月丁香综合视频| 成年人免费的视频| 亚洲色大成网站WWW国产| 久久九九久精品国产免费直播| 国产成人无码a区在线观看视频免费| 亚洲AV成人一区二区三区在线看| 国产精品美女午夜爽爽爽免费| 亚洲一本一道一区二区三区| 妞干网免费视频在线观看| 日韩国产精品亚洲а∨天堂免| 亚洲成人影院在线观看| 亚洲欧美一区二区三区日产| 99视频免费播放| 亚洲乱码国产乱码精品精| 久久免费观看国产99精品| 亚洲国产超清无码专区| 免费看又黄又无码的网站| 亚洲国产片在线观看| 免费国产污网站在线观看15| 亚洲一区二区三区精品视频 | 五月婷婷综合免费| 亚洲日韩一区二区三区| 免费在线观看中文字幕| 老司机精品免费视频| 亚洲 综合 国产 欧洲 丝袜| 亚洲欧美中文日韩视频| 亚洲性久久久影院| 99在线视频免费| 亚洲国产精品18久久久久久| 亚洲性在线看高清h片| 91精品导航在线网址免费| 亚洲日产乱码一二三区别| 亚洲无码在线播放| 女人被男人桶得好爽免费视频|