Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Reporting.WinForms;
using System.Reflection;
using System.Drawing.Printing;
using System.IO;
using System.Drawing.Imaging;
using System.Drawing;
namespace YourApp
{
public static class PrintReport{
private static int m_currentPageIndex;
private static IList<Stream> m_streams;
public static Stream CreateStream(string name,
string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
Stream stream = new MemoryStream();
m_streams.Add(stream);
return stream;
}
public static void Export(LocalReport report, bool print = true)
{
string deviceInfo =
@"<DeviceInfo>
<OutputFormat>EMF</OutputFormat>
<PageWidth>6.2in</PageWidth>
<PageHeight>8.3in</PageHeight>
<MarginTop>0.1in</MarginTop>
<MarginLeft>0.1in</MarginLeft>
<MarginRight>0.1in</MarginRight>
<MarginBottom>0.1in</MarginBottom>
</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream,
out warnings);
foreach (Stream stream in m_streams)
stream.Position = 0;
if (print)
{
Print();
}
}
// Handler for PrintPageEvents
public static void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new
Metafile(m_streams[m_currentPageIndex]);
// Adjust rectangular area with printer margins.
Rectangle adjustedRect = new Rectangle(
ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
ev.PageBounds.Width,
ev.PageBounds.Height);
// Draw a white background for the report
ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
// Draw the report content
ev.Graphics.DrawImage(pageImage, adjustedRect);
// Prepare for the next page. Make sure we haven't hit the end.
m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
public static void Print()
{
if (m_streams == null || m_streams.Count == 0)
throw new Exception("Error: no stream to print.");
PrintDocument printDoc = new PrintDocument();
if (!printDoc.PrinterSettings.IsValid)
{
throw new Exception("Error: cannot find the default printer.");
}
else
{
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
m_currentPageIndex = 0;
printDoc.Print();
}
}
public static void PrintToPrinter(this LocalReport report)
{
Export(report);
}
public static void DisposePrint()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
}
}
}
@janjuain79

This comment has been minimized.

Copy link

commented Nov 3, 2016

Thanks really helpful

@rajkumarpb

This comment has been minimized.

Copy link

commented Aug 21, 2019

Hi, the below is the piece of code which invokes the ReportViewer. Can you help me how do I use your plugin in this case? I tried the below code but its not working! I am noob in terms of C#. So help out fellow coder!

public void PrintReceipt(string sqlStr)
{
    GetSessionInfo();
    frmPrintReceipt frmPrintReceipt = new frmPrintReceipt();
    DataSet ds = new DataSet();
    SqlCeDataAdapter da = new SqlCeDataAdapter();
    SqlCeCommand cmd;
    cmd = new SqlCeCommand(sqlStr, new SqlCeConnection(CnString));
    da = new SqlCeDataAdapter(cmd);
    frmPrintReceipt.dsSQLCE.SalesInfo.Clear();
    da.Fill(frmPrintReceipt.dsSQLCE.SalesInfo);
    ReportParameter CompName = new ReportParameter("CompanyName", CompanyName);
    ReportParameter CompAddress = new ReportParameter("CompAddress", CompAddress);    
    frmPrintReceipt.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
    frmPrintReceipt.reportViewer1.LocalReport.ReportPath = @"Reports\SaleReceipt.rdlc";
    frmPrintReceipt.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { CompName, CompAddress});
    frmPrintReceipt.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout);
    frmPrintReceipt.reportViewer1.RefreshReport();
    // frmPrintReceipt.reportViewer1.Show();
    LocalReport report = new LocalReport();
    report.ReportEmbeddedResource = @"SaleReceipt.rdlc";
    report.DataSources.Add(reportDataSource);
    report.PrintToPrinter();
}
@shakee93

This comment has been minimized.

Copy link
Owner Author

commented Aug 21, 2019

Hi, the below is the piece of code which invokes the ReportViewer. Can you help me how do I use your plugin in this case? I tried the below code but its not working! I am noob in terms of C#. So help out fellow coder!

public void PrintReceipt(string sqlStr)
{
    GetSessionInfo();
    frmPrintReceipt frmPrintReceipt = new frmPrintReceipt();
    DataSet ds = new DataSet();
    SqlCeDataAdapter da = new SqlCeDataAdapter();
    SqlCeCommand cmd;
    cmd = new SqlCeCommand(sqlStr, new SqlCeConnection(CnString));
    da = new SqlCeDataAdapter(cmd);
    frmPrintReceipt.dsSQLCE.SalesInfo.Clear();
    da.Fill(frmPrintReceipt.dsSQLCE.SalesInfo);
    ReportParameter CompName = new ReportParameter("CompanyName", CompanyName);
    ReportParameter CompAddress = new ReportParameter("CompAddress", CompAddress);    
    frmPrintReceipt.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
    frmPrintReceipt.reportViewer1.LocalReport.ReportPath = @"Reports\SaleReceipt.rdlc";
    frmPrintReceipt.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { CompName, CompAddress});
    frmPrintReceipt.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout);
    frmPrintReceipt.reportViewer1.RefreshReport();
    // frmPrintReceipt.reportViewer1.Show();
    LocalReport report = new LocalReport();
    report.ReportEmbeddedResource = @"SaleReceipt.rdlc";
    report.DataSources.Add(reportDataSource);
    report.PrintToPrinter();
}

add this class to your project and update namespace YourApp with your apps namespace.
once you have this class in your app PrintToPrinter method will be available on LocalReport.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.