網絡打印概述
◆B/S結構導致了Web應用程序中打印的特殊性
◆程序運行在浏覽器中打印機在本地而文件卻可能在服務器上導致了打印控制不是很靈活
◆格式如何控制和定制等是我們開發中可能會面對的問題
打印文檔的生成
客戶端腳本方式
一般情況下主要使用JS可以分析源頁面的內容將欲打印的頁面元素提取出來實現打印通過分析源文檔的內容可以生成打印目標文檔
優點客戶端獨立完成打印目標文檔的生成減輕服務器負荷
缺點源文檔的分析操作復雜並且源文檔中的打印內容要有約定
服務器端程序方式
利用後台代碼從數據庫中讀取打印源生成打印目標文檔當的頁面生成時還應適當考慮使用CSS來實現強制分頁控制
優點可以生成內容非常豐富的打印目標文檔目標文檔的內容的可控性強由於打印內容是從數據庫中獲取的所以生成操作相對簡單
缺點服務器端負載比較大
頁面設置
◆頁面設置主要是指設置打印文檔的頁邊距頁眉頁腳紙張等內容頁面設置將直接影響到打印文檔版面的生成效果所以它和打印文檔的生成有著密切的關系比如表格的行數大小位置字體的大小等
現有的技術是利用IE 內置的打印模板方式來控制頁面設置其可以對打印目標文檔產生非常大的影響打印模板可以控制頁邊距頁眉頁腳奇偶頁等內容並可以將用戶的設置取得還可以將設置發送到服務器端打印模板技術可以自定預覽窗口和打印格式最大限度地影響目標文檔和打印效果
IE直接打印
直接調用windowprint或者webrower控件的ExecWB方法來打印
優點方便快捷客戶端無需任何設置即可
缺點打印控制不是很靈活如果直接調用
windowprint來打印頁面頁面上別的元素也會被打印處理頁頭頁尾的格式也不好控制
常用方法大部分情況會把查詢的結果綁定到DataGrid上來然後打印DataGrid這種情況的打印一般來說格式比較固定簡單確定後基本不會再作更改所以可以采用IE直接打印
【實例代碼】
注①這是客戶端通過windowprint打印指定內容這裡定義sprnstr和eprnstr來指定內容
執行代碼
<input type=button name=print value=預覽並打印 onclick=preview()>
②如果直接使用windowprint將打印頁面上的所有內容但是我們可以使用
st<<style> @media Print { Noprn { DISPLAY: none }}
用來指定不打印的內容
borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>
ee>
script language=Javascript>
function preview()
{
bdhtml=windowdocumentbodyinnerHTML;
sprnstr=<!startprint>;
eprnstr=<!endprint>;
prnhtml=bdhtmlsubstr(bdhtmlindexOf(sprnstr)+);
prnhtml=prnhtmlsubstring(prnhtmlindexOf(eprnstr));
windowdocumentbodyinnerHTML=prnhtml;
windowprint();
}
</script>
<!省略部分代碼>
<form id=WebForm method=post runat=server>
<center>本部分以上不被打印</center>
<!startprint>
<div align=center>
<asp:DataGrid id=dgShow runat=server>
<!省略部分代碼>
</asp:DataGrid>
</div>
<!endprint>
<center>本部分以下不被打印</center>
<div align=center>
<input type=button name=print value=預覽並打印 onclick=preview()>
</div>
<style> @media Print { Noprn { DISPLAY: none }}
</style>
<p class=Noprn>不打印</p>
<table id=datagrid>
<tr>
<td>打印</td>
</tr>
</table>
<input class=Noprn type=button onclick=windowprint() value=print>
</form>
WebBrowser控件技術
◆打印操作的實現
此功能的實現主要是利用WebBrowser控件的函數接口來實現打印打印預覽(默認的)頁面設置(默認的)
borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>
ee>
<object ID=WebBrowser WIDTH= HEIGHT=
CLASSID=CLSID:FADABCFDA>
//打印
WebBrowserExecWB();
//打印設置
WebBrowserExecWB();
//打印預覽
WebBrowserExecWB();
//直接打印
WebBrowserExecWB();
在把DataGrid轉換為對應的HTML代碼時如果存在按鈕列就會報錯最好把這一列隱藏一般只能轉換數據列其次要注意分頁問題一般只能打印當前一頁最好在打印之前除掉分頁導出到ExcelWord中去打印可以在服務端或者客戶端進行
優點使用這種方法可適應性比較強控制較好
缺點在服務端使用的話要求服務端要安裝WordExcel在客戶端使用的話要求客戶端在IE的安全設置上有一定要求
【實例代碼】
borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>
ee>
protected void btnMIME_Click(object sender SystemEventArgs e)
{
BindData();
ResponseContentType = application/vndmsexcel;
ResponseAddHeader(ContentDisposition inline;
filename=+HttpUtilityUrlEncode(下載文件xlsEncodingUTF));
//如果輸出為Word修改為以下代碼
//ResponseContentType = application/msword
//ResponseAddHeader(ContentDisposition inline;filename=testdoc)
StringBuilder sb=new StringBuilder();
SystemIOStringWriter sw = new SystemIOStringWriter(sb);
SystemWebUIHtmlTextWriter hw = new SystemWebUIHtmlTextWriter(sw);
sbAppend();
dgShowRenderControl(hw);
sbAppend();
ResponseWrite(sbToString());
ResponseEnd();
}
protected void btnCom_Click(object sender SystemEventArgs e)
{
ExportToExcel(BindData()ServerMapPath(ComExcelxls));
}
//從DataSet到出到Excel
#region從DataSet到出到Excel
///導出指定的Excel文件
public void ExportToExcel(DataSet dsstring strExcelFileName)
{
if (dsTablesCount== || strExcelFileName==) return;
doExport(dsstrExcelFileName);
}
///執行導出
private void doExport(DataSet dsstring strExcelFileName)
{
excelApplication excel= new excelApplication();
int rowIndex=;
int colIndex=;
excelApplicationWorkbooksAdd(true);
SystemDataDataTable table=dsTables[] ;
foreach(DataColumn col in tableColumns)
{
colIndex++;
excelCells[colIndex]=colColumnName;
}
foreach(DataRow row in tableRows)
{
rowIndex++;
colIndex=;
foreach(DataColumn col in tableColumns)
{
colIndex++;
excelCells[rowIndexcolIndex]=row[colColumnName]ToString();
}
}
excelVisible=false;
excelActiveWorkbookSaveAs(strExcelFileName+XLS
ExcelXlFileFormatxlExcelnullnullfalsefalse
ExcelXlSaveAsAccessModexlNoChangenullnullnullnullnull);
excelQuit();
excel=null;
GCCollect();//垃圾回收
}
#endregion
利用Net組件打印
利用Net組件
◆優點這種打印方式對於格式變化大數據量小的應用來說非常合適
◆缺點
◆需要客戶端安Net framework組件
◆Xml的解析上如果文件較大速度上不是很理想
◆頁面首次加載時會有明顯的延時
使用XSL和XSLT轉換Xml
◆XSL擴展樣式表語言可以通過它來把Xml轉換為其他的文本格式
◆XSL轉換包括發現或者選擇一個模式匹配通過使用XPath選擇一個結果集然後對結果集中的每一項為這些匹配定義結果輸出
◆XSL是一個功能強大的工具可以把Xml轉換成任何你想要的格式
【參考代碼】
borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>
ee>
XslTransform xslt = new XslTransform();
xsltLoad(ServerMapPath( StudentsToHTMLxsl) );
XPathDocument XDoc = new XPathDocument(ServerMapPath( StudentsXml ));
XmlWriter writer = new XmlTextWriter( serverMapPath(l)
SystemTextEncodingUTF );
xsltTransform( XDoc null writer );
writerClose();
ResponseRedirect(l);
利用ActiveX控件打印
利用第三方控件
◆自己開發控件這種方式很多商用軟件采用這種方式寫成控件後已經無所謂是在web中使用還是應用程序中使用了
優點打印方式非常靈活基本上程序能做到的web也能做得到
缺點客戶端需要安裝組件部署不是很方便
使用水晶報表
◆用戶僅需要Web 浏覽器就可以查看報表
◆報表查看器控件可以是應用程序中眾多控件之一
◆與報表輕松交互
◆用戶可將報表導出為Microsoft word 和Excel 格式以及PDFHTML 和Crystal Reports for visual Studio Net格式
◆可以使用報表控件直接打印
【實例代碼】
borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>
ee>
//水晶報表的填充省略連接代碼
myReport ReportDoc = new myReport();
ReportDocSetDataSource(ds);
CrvReportSource = ReportDoc;
//輸出為指定類型文件
CrystalDecisionsSharedDiskFileDestinationOptions DiskOpts = new
CrystalDecisionsSharedDiskFileDestinationOptions();
ReportDocExportOptionsExportDestinationType =
CrystalDecisionsSharedExportDestinationTypeDiskFile;
string strFileName = serverMapPath(Output);
switch (ddlFormatSelectedItemText)
{
case Rich Text (RTF):
ReportDocExportOptionsExportFormatType =
CrystalDecisionsSharedExportFormatTypeRichText;
DiskOptsDiskFileName =strFileName + rtf;
break;
case Portable Document (PDF):
ReportDocExportOptionsExportFormatType =
CrystalDecisionsSharedExportFormatTypePortableDocFormat;
DiskOptsDiskFileName = strFileName + pdf;
break;
case MS word (DOC):
ReportDocExportOptionsExportFormatType =
CrystalDecisionsSharedExportFormatTypeWordForWindows;
DiskOptsDiskFileName = strFileName + doc;
break;
case MS excel (XLS):
ReportDocExportOptionsExportFormatType =
CrystalDecisionsSharedExportFormatTypeExcel;//
DiskOptsDiskFileName = strFileName + xls;
break;
default:
break;
}
ReportDocExportOptionsDestinationOptions = DiskOpts;
ReportDocExport();
//打印
// 指定打印機名稱
string strPrinterName;
strPrinterName = @Canon BubbleJet BJCSP;
// 設置打印頁邊距
PageMargins margins;
margins = ReportDocPrintOptionsPageMargins;
marginsbottomMargin = ;
marginsleftMargin = ;
marginsrightMargin = ;
marginstopMargin = ;
ReportDocPrintOptionsApplyPageMargins(margins);
//應用打印機名稱
ReportDocPrintOptionsPrinterName = strPrinterName;
// 打印 // 打印報表將startPageN 和endPageN
// 參數設置為 表示打印所有頁
ReportDocPrintToPrinter( false);
From:http://tw.wingwit.com/Article/program/net/201311/12663.html