此博客大部分内容都是经过百度查阅,整理,并实现功能后总结而写,主要借鉴一下网址博客:
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纸的长度或者宽度,调试一下即可。