前提概要参考:http://www.cnblogs.com/liandy0906/p/7936524.html
private int m_currentPageIndex; /// <summary> /// 声明一个Stream对象的列表用来保存报表的输出数据,LocalReport对象的Render方法会将报表按页输出为多个Stream对象。 /// </summary> private IList<Stream> m_streams; private bool isLandSapces = false; private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { //如果需要将报表输出的数据保存为文件,请使用FileStream对象。 Stream stream = new MemoryStream(); m_streams.Add(stream); return stream; } public void PrintStream(LocalReport rvDoc) { //获取LocalReport中的报表页面方向 isLandSapces = rvDoc.GetDefaultPageSettings().IsLandscape; Export(rvDoc); PrintSetting(); Dispose(); } private void Export(LocalReport report) { string deviceInfo = @"<DeviceInfo> <OutputFormat>EMF</OutputFormat> </DeviceInfo>"; Warning[] warnings; m_streams = new List<Stream>(); //将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。 report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams) stream.Position = 0; } private void PrintSetting() { if (m_streams == null || m_streams.Count == 0) throw new Exception("错误:没有检测到打印数据流"); //声明PrintDocument对象用于数据的打印 PrintDocument printDoc = new PrintDocument(); //获取配置文件的清单打印机名称 //System.Configuration.AppSettingsReader appSettings = new System.Configuration.AppSettingsReader(); printDoc.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();//指定打印机不显示页码 //判断指定的打印机是否可用 if (!printDoc.PrinterSettings.IsValid) { throw new Exception("错误:找不到打印机"); } else { //设置打印机方向遵从报表方向 printDoc.DefaultPageSettings.Landscape = isLandSapces; //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。 printDoc.PrintPage += new PrintPageEventHandler(PrintPage); m_currentPageIndex = 0; //设置打印机打印份数 printDoc.PrinterSettings.Copies = 1; //执行打印操作,Print方法将触发PrintPage事件。 printDoc.Print(); } } private void PrintPage(object sender, PrintPageEventArgs ev) { //Metafile对象用来保存EMF或WMF格式的图形, //我们在前面将报表的内容输出为EMF图形格式的数据流。 Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); //调整打印机区域的边距 System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle( ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX, ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, ev.PageBounds.Width, ev.PageBounds.Height); //绘制一个白色背景的报告 //ev.Graphics.FillRectangle(Brushes.White, adjustedRect); //获取报告内容 //这里的Graphics对象实际指向了打印机 ev.Graphics.DrawImage(pageImage, adjustedRect); //ev.Graphics.DrawImage(pageImage, ev.PageBounds); // 准备下一个页,已确定操作尚未结束 m_currentPageIndex++; //设置是否需要继续打印 ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } public void Dispose() { if (m_streams != null) { foreach (Stream stream in m_streams) stream.Close(); m_streams = null; } }
客户端调用:PrintStream(rvDoc.LocalReport);