using Microsoft.Reporting.WinForms; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace BiskLog_Point_Of_Sale.Classes { public static class ReportConfig { private static List m_streams; private static int m_currentPageIndex = 0; static string printLocation = ""; static string ReportPrinterName =""; public static void PrintToPrinter(LocalReport report, string printLoc = null, string PrinterName = null) { printLocation = printLoc; ReportPrinterName = PrinterName; Export(report); } public static void Export(LocalReport report, bool print = true) { string deviceInfo = @" EMF 8.27in 11.69in 0.7874in 0.7874in 0.7874in 0.7874in "; 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(); } } public static void Print() { try { // if (m_streams == null || m_streams.Count == 0) // throw new Exception("Error: no stream to print."); PrintDocument printDoc = new PrintDocument(); if (!String.IsNullOrEmpty(printLocation)) { PrinterSettings printersettings = new PrinterSettings() { PrinterName = ReportPrinterName, PrintToFile = true, PrintFileName = printLocation , }; printDoc.PrinterSettings = printersettings; } else { PrinterSettings printersettings = new PrinterSettings() { PrinterName = ReportPrinterName, PrintToFile = false, }; printDoc.PrinterSettings = printersettings; } //if (!printDoc.PrinterSettings.IsValid) //{ // throw new Exception("Error: cannot find the default printer."); //} //else // { printDoc.PrintPage += new PrintPageEventHandler(PrintPage); m_currentPageIndex = 0; printDoc.Print(); //} } catch(Exception ex) { ErrorLogging.WriteToFile(ex.ToString()); } } 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 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 DisposePrint() { if (m_streams != null) { foreach (Stream stream in m_streams) stream.Close(); m_streams = null; } } } }