网络打印概述
◆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);