Skip to content

Instantly share code, notes, and snippets.

@shakee93
Created August 23, 2016 03:48
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save shakee93/f5eb53a1dfec486e1376d63c3063e51b to your computer and use it in GitHub Desktop.
Save shakee93/f5eb53a1dfec486e1376d63c3063e51b to your computer and use it in GitHub Desktop.
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
Copy link

Thanks really helpful

@rajkumarpb
Copy link

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
Copy link
Author

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.

@DaveMans
Copy link

DaveMans commented Dec 26, 2019

Thank you sooo much! it helped me a lot.

Regards from Guatemala.

@lokeshbabug
Copy link

Hi,
Thank you so much. This has saved my day. I just have one request. I was trying to use this code to print an rdlc report in landscape mode. I modified your code to make the page width to 11.69 in and height to 8.27 in. It is indeed printing the whole content on the page now, but its shrinking the content to fit into the page on portrait mode. Is there anyway i could use the above code to set the printing to landscape by default ? Would greatly appreciate your help.

@shakee93
Copy link
Author

shakee93 commented Oct 8, 2020

Hi,
Thank you so much. This has saved my day. I just have one request. I was trying to use this code to print an rdlc report in landscape mode. I modified your code to make the page width to 11.69 in and height to 8.27 in. It is indeed printing the whole content on the page now, but its shrinking the content to fit into the page on portrait mode. Is there anyway i could use the above code to set the printing to landscape by default ? Would greatly appreciate your help.

try adding this before line 91

printDoc.DefaultPageSettings.Landscape = true;

@lokeshbabug
Copy link

Hi,
Thank you so much. This has saved my day. I just have one request. I was trying to use this code to print an rdlc report in landscape mode. I modified your code to make the page width to 11.69 in and height to 8.27 in. It is indeed printing the whole content on the page now, but its shrinking the content to fit into the page on portrait mode. Is there anyway i could use the above code to set the printing to landscape by default ? Would greatly appreciate your help.

try adding this before line 91

printDoc.DefaultPageSettings.Landscape = true;

That's just perfect. Worked like a charm. Thanks a ton.

@Computerous
Copy link

Hi, first of all I'd like to thank you for sharing your code.

I've added the class and changed the namespace as needed and everything is ok, but when I run the code I get an exception of null referencing.

Below is how I used the code after I added the class:

        LocalReport report = new LocalReport();
        report.ReportEmbeddedResource = @"Report8.rdlc";
        report.DataSources.Add(new ReportDataSource("DataSet1", glBindingSource));
        report.PrintToPrinter();

the exception happens here:

       report.Render("Image", deviceInfo, CreateStream,
           out warnings);

part of the exception text is below:

at Microsoft.Reporting.WinForms.LocalReport.EnsureExecutionSession()System.NullReferenceException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089Object reference not set to an instance of an object. at Microsoft.ReportingServices.StandalonePreviewStore.GetReportDefinition(PreviewItemContext itemContext)System.NullReferenceException: Object reference not set to an instance of an object.

Where am I making the mistake?

@fakfarrukh
Copy link

Thanks for sharing..!!
I have one issue, It asks me to save files into pdf before printing. how can I avoid this I mean it should directly print the file rather than asking to save it.
Please help me with this issue.

@DaveMans
Copy link

Thanks for sharing..!!
I have one issue, It asks me to save files into pdf before printing. how can I avoid this I mean it should directly print the file rather than asking to save it.
Please help me with this issue.

@fakfarrukh I think you can find the solution here: https://stackoverflow.com/questions/34727037/print-rdlc-report-without-showing-reportviewer-control

@mikesilvercreek
Copy link

mikesilvercreek commented Jun 9, 2022

Thanks for posting the code!
What is the license for using this code? Can I used in a for profit application?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment