亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于ASP.NET的Web打印技術(shù)研究

        2008-12-31 00:00:00吳觀福
        電腦知識與技術(shù) 2008年12期

        摘要:打印是很多Web應用系統(tǒng)不可或缺的功能,而且是一項比較復雜的技術(shù),針對ASP.NET中的Web打印問題提出了五種解決方法,并指出每種方法的優(yōu)缺點,在開發(fā)過程中可以根據(jù)用戶的需求作相應選擇。

        關(guān)鍵詞:打??;ASP.NET;Web應用系統(tǒng);水晶報表

        中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)11-2pppp-0c

        Research on the ASP.NET-based Web Printing Technology

        WU Guan-fu

        (Dongguan Science Technology School,Dongguan 523106,China)

        Abstract:Printing is an important and complex technology of Web application system. The article bring forwards five methods on how to solve the problem which may arise during the ASP.NET-based Web printing, and points out the advantage and disadvantage of each methods, which can be selected by different customers based on their own requirement in the process of developing.

        Key words:Printing;ASP.NET;Web application system;Crystal Report

        打印是很多Web應用系統(tǒng)必不可少的功能,也是開發(fā)人員所面臨的一個共同難題。相對于Windows桌面應用程序來講,Web應用程序的打印有種種限制,技術(shù)人員在項目開發(fā)過程中經(jīng)常會遇到用戶這樣或那樣的需求。在開發(fā)基于ASP.NET的Web應用系統(tǒng)時,由于只能采用瀏覽器作為用戶界面進行交互,所以不能精確地控制客戶端的打印機。因此,針對如何在客戶端實現(xiàn)ASP.NET下的Web打印這一問題,本文提出五種解決方法:

        (1)利用IE直接實現(xiàn)Web打??;

        (2)利用.NET組件實現(xiàn)Web打印;

        (3)利用第三方控件實現(xiàn)Web打??;

        (4)導出到Excel中實現(xiàn)Web打印;

        (5)利用水晶報表實現(xiàn)Web打印

        1 利用IE直接實現(xiàn)Web打印

        1.1 調(diào)用window.print()方法實現(xiàn)打印

        在頁面上添加“打印”按鈕,然后增加如下代碼:

        這段代碼很簡單,是通過Javascript腳本語言調(diào)用window.print()方法來實現(xiàn)打印。但是,如果采用這種方式來打印頁面,頁面上不需要的對象也會被打印處理。為了不打印某個對象,可以通過在樣式表CSS中設置打印或顯示樣式來隱藏這些對象,代碼如下:

        該樣式表將media的屬性設置為print來控制打印輸出樣式,如果在“打印”按鈕的屬性中加上class=\"Noprn\",這樣按鈕就不會被打印出來。

        1.2 調(diào)用IE內(nèi)置的WebBrowser控件實現(xiàn)打印

        使用Window.Print()有一個不足之處,就是不能進行打印預覽和頁面設置。使用WebBrowser控件可以很方便的解決這個問題。WebBrowser是IE內(nèi)置的瀏覽器控件,無需用戶下載,可以通過調(diào)用WebBrowser控件的ExecWB方法實現(xiàn)打印,加入ID為WebBrowser1的WebBrowser控件,代碼如下:

        定義對象以后,可以使用這個對象完成打印設置、預覽及打印功能,代碼如下:

        調(diào)用上面的Javascript函數(shù)可以實現(xiàn)打印設置、打印預覽和打印功能??蛻舳霜毩⑼瓿纱蛴∧繕宋臋n的生成,減輕了服務器端的負荷。

        2 利用.NET組件實現(xiàn)Web打印

        如果要求精確控制打印效果,并且出于安全性考慮,不能直接連接數(shù)據(jù)庫時,可以采用.NET編寫的受控組件實現(xiàn)Web打印,該方式在.NET Common Language Runtime的控制之下運行,不需要進行客戶端注冊,比ActiveX安全性高,代碼編寫方便,直接支持XML技術(shù),具有很強的打印控制功能并且與IE兼容性高。其原理是通過XML強大的自定義功能,自定義出所有需要的格式控制標簽,在服務器端進行動態(tài)編碼后通過Web服務器傳到客戶端,然后在客戶端進行格式解析,根據(jù)服務器端定義的打印格式從客戶端直接控制打印機實現(xiàn)Web打印。

        由于不允許直接連接到數(shù)據(jù)庫,因此,只能采用XML文件進行中間數(shù)據(jù)交換格式。.NET內(nèi)部已經(jīng)集成了XML解析器,直接就可以通過使用.NET類庫調(diào)用。既可以做成桌面應用程序形式,通過遠程調(diào)用;也可以嵌入到IE瀏覽器中,直接在網(wǎng)頁中運行。

        使用XSL(擴展樣式表語言)將XML轉(zhuǎn)換成其他的文本格式,XSL轉(zhuǎn)換包括發(fā)現(xiàn)或者選擇一個模式匹配,通過使用XPath選擇一個結(jié)果集,然后對結(jié)果集中的每一項,為這些匹配定義結(jié)果輸出。XSL是一個功能強大的工具,可以把XML轉(zhuǎn)換成任何想要的格式。代碼如下:

        //創(chuàng)建新的XslTransform對象

        XslTransform xslt=new XslTransform();

        //從XSL文件中導入樣式表

        xslt.Load(Server.MapPath(\"WorkersToHTML.xsl\"));

        //創(chuàng)建新的XPathDocument對象,并導入XML文件

        XPathDocument XDoc = new XPathDocument(Server.MapPath(\"Workers.XML\"));

        //創(chuàng)建新的XmlTextWriter對象用于導出HTML格式文件

        XmlWriter writer = new XmlTextWriter(Server.MapPath(\"Workers.html\"), System.Text.Encoding.UTF8);

        //進行實際的XSLT轉(zhuǎn)換操作

        xslt.Transform(XDoc, 1, writer);

        //操作完成后關(guān)閉XmlTextWriter對象

        writer.Close();

        采用服務器腳本動態(tài)生成XML文檔時,發(fā)送內(nèi)容類型應該設置為text/xml(普通html頁面為text/html),字符編碼應該為UTF-8,否則會出現(xiàn)編碼錯誤問題。這種打印方式適合于格式變化大,數(shù)據(jù)量小的應用,但是客戶端需要安裝.NET Framework組件,對于數(shù)據(jù)量大的XML文件,解析速度不是很理想,頁面首次加載時會有明顯的延時。

        3 利用第三方控件實現(xiàn)Web打印

        采用第三方控件是開發(fā)Web應用系統(tǒng)比較好的選擇,由于第三方控件的易操作性,可以讓程序員完全從繁雜的打印編程中解放出來,在較短的時間內(nèi)做出做秀的報表打印系統(tǒng),進一步提高開發(fā)效率。但第三方控件一般不是免費的,下面以ScriptX.cab控件為例。

        下載ScriptX.cab控件,修改codebase的值,默認下面的設置也可以,加載控件代碼如下:

        使用控件代碼如下:

        function PrintSet()

        {

        factory.printing.SetMarginMeasure(2)

        factory.SetPageRange(1,l,3)//設置指定打印的頁面

        factory.printing.printer=\"HP DeskJet 870C\"

        factory.printing.copies=2

        factory.printing.collate=true

        factory.printing.papersize=\"A4\"

        factory.printing.paperSource=\"Manual feed\"

        factory.printing.header=\"This is MeadCo\"

        factory.printing.footer=\"Advanced Printing by ScriptX\"

        factory.printing.portrait=1

        factory.printing.leftMargin=1.0

        factory.printing.topMargin=1.0

        factory.printing.rightMargin=1.0

        factory.printing.bottomMargin=l.0

        factory.printing.Print(1)//直接打印

        factory.Printing.PageSetup()//打印設置

        factory.printing.Preview()//打印預覽

        }

        4 導出到Excel中實現(xiàn)Web打印

        這種方式將Web打印問題轉(zhuǎn)化成數(shù)據(jù)導出問題,開發(fā)過程簡單易行。導出到Excel有兩種方法可以實現(xiàn):一種通過瀏覽器直接導出;另外一種通過COM接口來實現(xiàn)。本文采用第一種方式,這種方式不僅靈活,而且代碼也很容易實現(xiàn),具體代碼如下:

        Response.ContentType=\"application/vnd.ms-excel\";

        Response.AddHeader(\"Content-Disposition\",\"inline,filename=\"+HttpUtility.UrlEncode(labTitle.Text+\".xls\",Encoding.UTF8));

        //AddHeader方法用指定的值添加HTML標題

        StringBuilder MyBuilder=new StringBuilder();

        StringWriter MyWriter=new StringWriter(MyBuilder);

        HtmlTextWriter MyHtml = new HtmlTextWriter(MyWriter);

        MyBuilder.Append(\"\");

        dtgSanitation.RenderControl(MyHtml);

        MyBuilder.Append(\"\");

        Response.Write(MyBuilder.ToString());

        Response.End();

        該方式需要注意兩個問題:第一,導出DataGrid時,其各列應該為數(shù)據(jù)綁定列,按鈕列導出時會出現(xiàn)不需要的結(jié)果,如果有類似于按鈕列等非數(shù)據(jù)綁定列,應該在DataGrid對象的RenderControl之前,將它隱藏再導出。第二,DataGrid存在分頁問題,因為RenderControl方法只處理當前頁的數(shù)據(jù),所以在此方法之前,應去掉DataGrid分頁,將數(shù)據(jù)放到一頁內(nèi)再導出。

        導出到Excel后用戶可以自定義打印的內(nèi)容和格式,具有良好的靈活性,適應性和控制性。但是此方法有一個限制

        就是要保證安裝有Excel軟件,在客戶端使用時要求客戶端在IE的安全設置上有一定的要求。

        5 利用水晶報表實現(xiàn)Web打印

        利用水晶報表來處理打印問題,其優(yōu)點是打印非常靈活、方便;打印的內(nèi)容豐富多彩;有強大的內(nèi)容創(chuàng)建、集成功能和高效的報表技術(shù)。其取得數(shù)據(jù)有兩種方法來實現(xiàn)。

        (1)Pull模式,即被請求時,水晶報表直接工具指定的驅(qū)動連接數(shù)據(jù)庫,然后組裝這些數(shù)據(jù)。

        (2)Push模式,此時開發(fā)人員必須自己編寫代碼連接數(shù)據(jù)并組裝到DataSet,同時將它傳送到報表。在Push模式下,通過使用連接共享,以及限制記錄集合的大小,可以使報表性能最大化,所以我們使用Push模式來解決問題,其主要步驟為:

        ①添加數(shù)據(jù)集文件,創(chuàng)建相應的數(shù)據(jù)集表(即創(chuàng)建一個類型化數(shù)據(jù)集)。

        ②使用水晶報表專家生成報表。

        ③添加報表查看器控件,設置好控件的屬性。

        ④編寫相關(guān)代碼。

        實現(xiàn)代碼如下:// 聲明一個報表對象

        Reports ReportDoc=new Reports();

        SqlConnection MyConn;

        private void Page_Load(object sender,System.EventArgs e)

        { string strProvider=\"Server=(local);DataBase=test;UID=sa;PWD=\";

        MyConn=new SqlConnection(strProvider);

        }

        //點擊查看按鈕,得到動態(tài)統(tǒng)計圖

        private void IgbFind_Click(object sender,System.Web.UI.ImageClickEventArgs e)

        {//調(diào)用SQL存儲過程

        string strSel = \"sp_StatDeptWeekSani'\"+DdlContext.SelectedValue+\"','\"+DdlYear.SelmtedValue+\"'\";

        SqlDataAdapter MyAdapter=new SqlDataAdapter(strSel,MyConn);

        DataSet dsl=new DataSet();

        MyAdapter.Fill(dsl,\"tblTongji\");

        ReportDoc.SetDataSource(dsl);

        Crv.ReportSource= ReportDoc; //報表查看器對象Crv顯示該報表

        }

        //點擊打印按鈕,打印出該統(tǒng)計圖

        private void IgbPrint_Click(object sender,System.Web.UI.ImageClickEventArgs e)

        {//設置打印頁邊距

        PageMargins MyMargins=ReportDoc.Printoptions.PageMargins;

        MyMargins.bottomMargin = 250;

        MyMargins.leftMargin = 350;

        MyMargins.rightMargin = 350;

        MyMargins.topMargin = 450;

        ReportDoc.Printoptions.ApplyPageMargins(MyMargins);

        ReportDoc.Printoptions.PrinterName = @\"HPLaserJet 4000 Series PS\";

        ReportDoc.PrintToPrinter(1,1,0,0); //參數(shù)設置為0表示打印所有頁。

        }

        水晶報表有很多優(yōu)點,適合于開發(fā)大型的報表系統(tǒng),使用這種方式進行打印非常靈活,但是也存在客戶端需要安

        裝和部署不方便的缺點。在.NET 2003框架中,由于水晶報表屬于第三方控件,需要注冊才能夠使用。

        6 結(jié)束語

        基于ASP.NET的Web打印問題是我們在開發(fā)Web應用系統(tǒng)所面臨的實際問題,具體采用何種方式進行Web打印,這涉及到方案的適用性問題。一方面是由打印內(nèi)容、打印方式和其它用戶打印需求決定;另一方面還要考慮系統(tǒng)的實際運行效率和系統(tǒng)的安全性。為了進一步提高系統(tǒng)的安全性,可以直接采用SSL安全套接字等已經(jīng)成熟的WEB加密技術(shù)。

        參考文獻:

        [1]唐偉.ASP.NET環(huán)境下查詢式Web動態(tài)報表的實現(xiàn)[J].計算機與現(xiàn)代化,2006(9):123-126.

        [2]徐海賢.ASP.NET之Web打印初探[J].信息技術(shù),2006(1):95-117.

        [3]Visual Studio Magazine2002-2003中文精華合集[M].北京:電子工業(yè)出版杜,2OO4.

        [4]Mickey Williams.Visual c#.NET技術(shù)內(nèi)幕[M].北京:清華大學出版社,2004.

        收稿日期:2008-01-26

        作者簡介:吳觀福(1975-),男,華中科技大學碩士研究生,東莞理工學校講師,軟件設計師,研究方向:數(shù)據(jù)庫技術(shù)、軟件開發(fā)技術(shù)。

        男女男在线精品网站免费观看| 成人大片免费观看视频| 亚洲国产精品18久久久久久 | 国产成人午夜福利在线小电影| 99久久免费精品高清特色大片| 国产精品久久久久孕妇| 中文字幕亚洲精品综合| 国产高清一区二区三区四区色| 欧美激情肉欲高潮视频| 男男车车的车车网站w98免费 | 国产va免费精品高清在线观看| 熟妇人妻丰满少妇一区 | 日本成人午夜一区二区三区| 国产精品a免费一区久久电影| 牛鞭伸入女人下身的真视频| 中文字幕天堂网| 欧美日韩a级a| 国产在线观看女主播户外| 国产极品女主播国产区| 欧美熟妇精品一区二区三区| 国产美女69视频免费观看| 亚洲精品综合久久国产二区| 99国产精品久久久久久久成人热| 水蜜桃亚洲一二三四在线| 日韩在线精品在线观看 | 久青草久青草视频在线观看| 97se亚洲国产综合自在线图片| 亚洲av乱码一区二区三区女同| 日韩亚洲在线观看视频| 欧美激情综合色综合啪啪五月| 色窝窝免费播放视频在线| 日韩人妻无码精品系列专区无遮 | 免费 无码 国产精品| 伊人久久大香线蕉av不变影院| 青娱乐极品视觉盛宴国产视频| 国产成人精品999在线观看| 亚洲人成网站久久久综合| 中文字幕有码在线亚洲| 新婚少妇无套内谢国语播放| 99蜜桃在线观看免费视频网站| √最新版天堂资源在线|