C# winform打印RDLC

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

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纸的长度或者宽度,调试一下即可。


猜你喜欢

转载自blog.csdn.net/Mj_kk/article/details/75672450