/// /// Copyright (c) 2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Printing; using System.IO; using Config.Entities; using TBF.Resources; namespace TBF.BenchControl.ResultsPrinters.LabelPrinter { public class PrintLabelDocument : PrintDocument { const int FontSize = 9; const string FontFamilyName = "Arial"; //"Times New Roman"; readonly int paperWidth; readonly int paperHeight; readonly string templateFile; /// Property variable for the Font the user wishes to use Font font; /// /// Data to print /// Results.Entities.Batch batch; /// /// Items to print /// IList rsltItems; /// /// Layout and status /// int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page int nrPages; int pageNr; /// Page number to be printed at the bottom of the page /// /// Constructor /// /// Text to be printed public PrintLabelDocument(Results.Entities.Batch batch, PageOrientation pageOrientation, int paperWidth, int paperHeight, string templateFile) { this.batch = batch; this.paperWidth = paperWidth; this.paperHeight = paperHeight; this.templateFile = templateFile; DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape); if (batch.WaterMeters[0].Compound()) { rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM); } else { rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM); } /// Set print area size and margins (in dots using 80 dpi) int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; int leftMargin = base.DefaultPageSettings.Margins.Left; /// X int topMargin = base.DefaultPageSettings.Margins.Top; /// Y /// Check if the user selected to print in Landscape mode /// if they did then we need to swap height/width parameters if (DefaultPageSettings.Landscape) { int tmp = printHeight; printHeight = printWidth; printWidth = tmp; } /// One watermeter per label/page nrPages = batch.WaterMeters.Count; pageNr = 1; nextWMNr = 0; } /// /// Override the default onbeginPrint method of the PrintDocument Object /// /// /// protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e) { base.OnBeginPrint(e); if (font == null) { font = new Font(FontFamilyName, FontSize, FontStyle.Regular); } } /// /// Override the default OnPrintPage method of the PrintDocument. /// /// /// This provides the print logic for our document protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e) { /// Run base code base.OnPrintPage(e); if (File.Exists(templateFile)) { Image img = Image.FromFile(templateFile); e.Graphics.DrawImage(new Bitmap(img), new Rectangle(0, 0, paperWidth, paperHeight)); } /// Set print area size and margins (in dots using 80 dpi) int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom; int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right; int leftMargin = base.DefaultPageSettings.Margins.Left; /// X int topMargin = base.DefaultPageSettings.Margins.Top; /// Y /// Check if the user selected to print in Landscape mode /// if they did then we need to swap height/width parameters if (base.DefaultPageSettings.Landscape) { int tmp = printHeight; printHeight = printWidth; printWidth = tmp; } int x = leftMargin; int y = topMargin; /// Use the StringFormat class for the text layout of our document StringFormat format = new StringFormat(StringFormatFlags.LineLimit); ///-------- /// Body ///-------- PrintWM(e, nextWMNr); nextWMNr++; e.HasMorePages = (nextWMNr < batch.WaterMeters.Count); } /// /// Print one water meter results /// /// Water meter number (0-based) void PrintWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr) { if (wmNr >= batch.WaterMeters.Count) return; Results.Entities.WaterMeter wm = batch.WaterMeters[wmNr]; if (wm == null) return; /// Serial number if (!string.IsNullOrEmpty(wm.SerialNr)) PrintAt(e, 20, 62, wm.SerialNr); /// Watermeter type PrintAt(e, 20, 74, batch.ProtocolTitle); /// Date PrintAt(e, 135, 74, DateTimeStr(batch.EndTime)); if (rsltItems.Count > 0) { int printPosition = 1; foreach (var mtr in wm.MeterTestRslts) { string itemText; if (!wm.Compound()) { itemText = rsltItems[0].Print(mtr); } else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound) { Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain); itemText = rsltItems[0].PrintCombined(mainMtr, auxMtr, mtr); } else { continue; } string[] texts = itemText.Split(new char[] { '|' }); if (texts.Length == 2) { Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); itemText = texts[0]; /// TODO: How to print colors? } PrintAt(e, 78, 6 + 14 * printPosition, string.Format("{0}%", itemText)); printPosition++; } } } void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text) { PrintAt(e, p.X, p.Y, text); } void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text) { RectangleF printArea = new RectangleF(x, y, 667, 18); e.Graphics.DrawString(text, this.font, Brushes.Black, printArea); } string DateTimeStr(DateTime dateTime) { return string.Format("{0}/{1}/{2}", dateTime.Day.ToString("D2"), dateTime.Month.ToString("D2"), (dateTime.Year % 100).ToString("D2")); } } }