C# winform打印RDLC

来源:互联网 发布:js防水涂料检验批 编辑:程序博客网 时间:2024/05/17 03:55

此博客大部分内容都是经过百度查阅,整理,并实现功能后总结而写,主要借鉴一下网址博客:

http://www.cnblogs.com/qiuweiguo/archive/2011/08/26/2154706.html

查阅了很多资料,大部分都是直接打印Report文件,而我的需求是打印窗体上的reportViewer控件,其实逻辑代码都是差不多,先在bin中生成emp文件。

主要代码如下:

//添加命名空间using System.IO;using System.Drawing.Printing;using System.Drawing.Imaging;

 //生成 emf文件        private void Export(LocalReport report)        {            string deviceInfo =              @"<DeviceInfo>" +              "  <OutputFormat>EMF</OutputFormat>" +                           "</DeviceInfo>";            Warning[] warnings;            m_streams = new List<Stream>();            report.Render("Image", deviceInfo, CreateStream, out warnings);        }
 private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)        {                      Stream stream = new FileStream(name + "." + fileNameExtension,            FileMode.Create);            m_streams.Add(stream);            return stream;        }
 private int m_currentPageIndex;
 private void Print()           {            m_currentPageIndex = 0;            if (m_streams == null || m_streams.Count == 0)                return;            //声明PrintDocument对象用于数据的打印            PrintDocument printDoc = new PrintDocument();            //指定需要使用的打印机的名称            printDoc.PrinterSettings.PrinterName = "Brother HL-5440D series";                        //判断指定的打印机是否可用            if (!printDoc.PrinterSettings.IsValid)            {                MessageBox.Show("找不到打印机");                return;            }            //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);            //执行打印操作,Print方法将触发PrintPage事件。            printDoc.Print();        }
 private void PrintPage(object sender, PrintPageEventArgs ev)        {            //Metafile对象用来保存EMF或WMF格式的图形,            //我们在前面将报表的内容输出为EMF图形格式的数据流。            m_streams[m_currentPageIndex].Position = 0;            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.PageSettings.Landscape = false;            //这里的Graphics对象实际指向了打印机            ev.Graphics.DrawImage(pageImage, adjustedRect);  //防止字体变大             m_streams[m_currentPageIndex].Close();            m_currentPageIndex++;            //设置是否需要继续打印            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);        }
 private void b1_Click(object sender, EventArgs e)        {            Export(reportViewer1.LocalReport);            Print();        }


根据以上代码就可以调用打印机进行打印了,如果出现空白页,或者是出现只有页眉和页脚的的页面,可以通过下面的方式解决:

1.选择Report文件,点击下图这里,切换成报表





ConsumeConteinerWhitespace 的属性,默认是false,改成True 即可。

如果还有空白页,可能是你报表设计超过A4纸的长度或者宽度,调试一下即可。


原创粉丝点击