-
-
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, 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?
That's just perfect. Worked like a charm. Thanks a ton.