using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Text; using Microsoft.Reporting.WebForms; namespace Webclient.Helpers { public static class PrintReport { private static int m_currentPageIndex; private static IList 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 = "" + " PDF" + " 8.25in" + " 11.6in" + " 0.5in" + " 0.5in" + " 0.5in" + " 0.5in" + ""; Warning[] warnings; m_streams = new List(); 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) { var pageImage = new Metafile(m_streams[m_currentPageIndex]); // Adjust rectangular area with printer margins. var 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."); var printDoc = new PrintDocument(); if (!printDoc.PrinterSettings.IsValid) { throw new Exception("Error: cannot find the default printer."); } printDoc.PrintPage += 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; } } } }