-
-
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; | |
} | |
} | |
} | |
} |
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();
}
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.
Thank you sooo much! it helped me a lot.
Regards from Guatemala.
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.
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;
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.
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?
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.
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
Thanks for posting the code!
What is the license for using this code? Can I used in a for profit application?
Thanks really helpful