当前位置: 代码迷 >> .NET报表 >> VS2010 RDLC直接打印,式样和web页面显示的不一样,求解!
  详细解决方案

VS2010 RDLC直接打印,式样和web页面显示的不一样,求解!

热度:4940   发布时间:2013-02-25 00:00:00.0
VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
其实reportviewer是有打印按钮的,但是,现在要求做自定义打印的按钮。我在网上找了直接打印rdlc的代码,但是,现在,页面显示的效果和打印出来的效果完全不一样。求解。
正确图如下:
现在的预览错误图如下:
代码如下:
C# code
#region 打印        private PrintDocument printDocument1 = new PrintDocument();//打印窗体        string ktitle = string.Empty;        //声明一个Stream对象的列表用来保存报表的输出数据        //LocalReport对象的Render方法会将报表按页输出为多个Stream对象。        private List<Stream> m_streams = new List<Stream>();        //用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。        private Stream CreateStream(string name, string fileNameExtension,           Encoding encoding, string mimeType, bool willSeek)        {            //如果需要将报表输出的数据保存为文件,请使用FileStream对象。            Stream stream = new MemoryStream();            m_streams.Add(stream);            return stream;        }        protected void btnPrint_Click1(object sender, EventArgs e)        {            try            {                //LocalReport report = new LocalReport();                //设置需要打印的报表的文件名称。                //report.ReportPath = @"Print/reportOrderPrint.rdlc";                //创建要打印的数据源                //ReportDataSource source = new ReportDataSource("OrderDataset", ObjectDataSource1);                //report.DataSources.Add(source);                //刷新报表中的需要呈现的数据                //report.Refresh();                LocalReport report = this.rvOrderPrint.LocalReport;                string deviceInfo =                     "<DeviceInfo>" +                    "  <OutputFormat>EMF</OutputFormat>" +                     "  <PageWidth>29.7cm</PageWidth>" +                    "  <PageHeight>21cm</PageHeight>" +                    "  <MarginTop>0.5cm</MarginTop>" +                    "  <MarginLeft>0.5cm</MarginLeft>" +                      "  <MarginRight>0.5cm</MarginRight>" +                     "  <MarginBottom>0.5cm</MarginBottom>" +                   "</DeviceInfo>";                Warning[] warnings;                //将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。                report.Render("Image", deviceInfo, CreateStream, out warnings);            }            catch (Exception ex)            {                log.Error(ex.Message);            }            Print();//打印事件        }        //用来记录当前打印到第几页了           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 = "";            //判断指定的打印机是否可用              //if (!printDoc.PrinterSettings.IsValid)            //{            //    MessageBox.Show("Can't find printer");            //    return;            //}            //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。              printDoc.PrintPage += new PrintPageEventHandler(PrintPage);            //执行打印操作,Print方法将触发PrintPage事件。              printDoc.DefaultPageSettings.PaperSize.RawKind = 9;            //横版打印            printDoc.DefaultPageSettings.Landscape = true;            //打印预览                               PrintPreviewDialog ppd = new PrintPreviewDialog();            ppd.Document = printDoc;            if (DialogResult.OK == ppd.ShowDialog())            {                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]);            ev.PageSettings.PaperSize.RawKind = 9;            //指定是否横向打印            ev.PageSettings.Landscape = true;            //这里的Graphics对象实际指向了打印机               ev.Graphics.DrawImage(pageImage, 0, 0);            m_streams[m_currentPageIndex].Close();            m_currentPageIndex++;            //设置是否需要继续打印              ev.HasMorePages = (m_currentPageIndex < m_streams.Count);        }        #endregion
  相关解决方案