using System; using System.Drawing; using System.Drawing.Printing; using System.Linq; using System.Windows.Forms; namespace Neo.LegitimateLicences.ActiveX.Printing { public class ProviderCertificatePrinter { #region Properties private readonly string _platformProviderID; private readonly string _legalName; private readonly string _tradingName; private readonly string _businessRegNumber; private readonly string _registeredAddressLine1; private readonly string _registeredAddressLine2; private readonly string _registeredAddressSuburb; private readonly string _registeredAddressCity; private readonly string _registeredAddressProvinceID; private readonly string _registeredAddressPostalCode; private readonly string _certificateNumber; private readonly string _issueNumber; private readonly string _receiptNumber; private readonly string _issuedAt; private readonly string _ExpiresAt; private readonly short _copies; private readonly string _printerPath; private readonly int _height; private readonly int _width; private readonly int _leftMargin; private readonly bool _preview; private readonly bool _isTest; private readonly Font _normal = new Font("Arial", 9); private readonly Font _bold = new Font("Arial", 9, FontStyle.Bold); private readonly Font _heading = new Font("Arial", 9, FontStyle.Bold); private readonly Font _small = new Font("Arial", 8); private int _yCoord; #region HEADER private readonly int _lb1; private readonly int _lb2; private readonly int _lb3; private readonly int _lb4; private readonly int _lb5; #endregion #region CERTIFICATE PARTICULARS private readonly int _lb6; private readonly int _lb7; private readonly int _lb8; private readonly int _lb9; private readonly int _lb10; private readonly int _lb11; private readonly int _lb12; private readonly int _lb13; private readonly int _lb14; private readonly int _lb15; private readonly int _lb16; private readonly int _lb17; private readonly int _lb18; private readonly int _lb19; private readonly int _lb20; private readonly int _lb21; private readonly int _lb22; private readonly int _lb23; private readonly int _lb24; private readonly int _lb25; private readonly int _lb26; private readonly int _lb27; private readonly int _lb28; private readonly int _lb29; private readonly int _lb30; private readonly int _lb31; #endregion #endregion #region ProviderCertificatePrinter public ProviderCertificatePrinter(string platformProviderID, string legalName, string tradingName, string businessRegNumber, string registeredAddressLine1, string registeredAddressLine2, string registeredAddressSuburb, string registeredAddressCity, string registeredAddressProvinceID, string registeredAddressPostalCode, string certificateNumber, string issueNumber, string receiptNumber, string issuedAt, string expiresAt, short copies, string printerPath, int height, int width, bool preview, bool isTest) { _platformProviderID = platformProviderID; _legalName = legalName; _tradingName = tradingName; _businessRegNumber = businessRegNumber; _registeredAddressLine1 = registeredAddressLine1; _registeredAddressLine2 = registeredAddressLine2; _registeredAddressSuburb = registeredAddressSuburb; _registeredAddressCity = registeredAddressCity; _registeredAddressProvinceID = registeredAddressProvinceID; _registeredAddressPostalCode = registeredAddressPostalCode; _certificateNumber = certificateNumber; _issueNumber = issueNumber; _receiptNumber = receiptNumber; _issuedAt = issuedAt; _ExpiresAt = expiresAt; _copies = copies; _printerPath = printerPath; _height = height; //in mm _width = width; //in mm _leftMargin = 55; _preview = preview; _isTest = isTest; #region position defaults (copied from control int lb1 = 90; int lb2 = 15; int lb3 = 55; int lb4 = 30; int lb5 = 20; int lb6 = 30; int lb7 = 30; int lb8 = 30; int lb9 = 30; int lb10 = 30; int lb11 = 30; int lb12 = 30; int lb13 = 30; int lb14 = 30; int lb15 = 30; int lb16 = 30; int lb17 = 30; int lb18 = 30; int lb19 = 60; int lb20 = 30; int lb21 = 15; int lb22 = 15; int lb23 = 15; int lb24 = 15; int lb25 = 30; int lb26 = 15; int lb27 = 15; int lb28 = 15; int lb29 = 60; int lb30 = 30; int lb31 = 30; _lb1 = lb1; _lb2 = lb2; _lb3 = lb3; _lb4 = lb4; _lb5 = lb5; _lb6 = lb6; _lb7 = lb7; _lb8 = lb8; _lb9 = lb9; _lb10 = lb10; _lb11 = lb11; _lb12 = lb12; _lb13 = lb13; _lb14 = lb14; _lb15 = lb15; _lb16 = lb16; _lb17 = lb17; _lb18 = lb18; _lb19 = lb19; _lb20 = lb20; _lb21 = lb21; _lb22 = lb22; _lb23 = lb23; _lb24 = lb24; _lb25 = lb25; _lb26 = lb26; _lb27 = lb27; _lb28 = lb28; _lb29 = lb29; _lb30 = lb30; _lb31 = lb31; #endregion } public ProviderCertificatePrinter(string platformProviderID, string legalName, string tradingName, string businessRegNumber, string registeredAddressLine1, string registeredAddressLine2, string registeredAddressSuburb, string registeredAddressCity, string registeredAddressProvinceID, string registeredAddressPostalCode, string certificateNumber, string issueNumber, string receiptNumber, string issuedAt, string expiresAt, short copies, string printerPath, int height, int width, bool preview, int lb1, int lb2, int lb3, int lb4, int lb5, int lb6, int lb7, int lb8, int lb9, int lb10, int lb11, int lb12, int lb13, int lb14, int lb15, int lb16, int lb17, int lb18, int lb19, int lb20, int lb21, int lb22, int lb23, int lb24, int lb25, int lb26, int lb27, int lb28, int lb29, int lb30, int lb31, bool isTest) { _platformProviderID = platformProviderID; _legalName = legalName; _tradingName = tradingName; _businessRegNumber = businessRegNumber; _registeredAddressLine1 = registeredAddressLine1; _registeredAddressLine2 = registeredAddressLine2; _registeredAddressSuburb = registeredAddressSuburb; _registeredAddressCity = registeredAddressCity; _registeredAddressProvinceID = registeredAddressProvinceID; _registeredAddressPostalCode = registeredAddressPostalCode; _certificateNumber = certificateNumber; _issueNumber = issueNumber; _receiptNumber = receiptNumber; _issuedAt = issuedAt; _ExpiresAt = expiresAt; _copies = copies; _printerPath = printerPath; _height = height; //in mm _width = width; //in mm _leftMargin = 55; _preview = preview; _isTest = isTest; _lb1 = lb1; _lb2 = lb2; _lb3 = lb3; _lb4 = lb4; _lb5 = lb5; _lb6 = lb6; _lb7 = lb7; _lb8 = lb8; _lb9 = lb9; _lb10 = lb10; _lb11 = lb11; _lb12 = lb12; _lb13 = lb13; _lb14 = lb14; _lb15 = lb15; _lb16 = lb16; _lb17 = lb17; _lb18 = lb18; _lb19 = lb19; _lb20 = lb20; _lb21 = lb21; _lb22 = lb22; _lb23 = lb23; _lb24 = lb24; _lb25 = lb25; _lb26 = lb26; _lb27 = lb27; _lb28 = lb28; _lb29 = lb29; _lb30 = lb30; _lb31 = lb31; } #endregion #region Print public void Print() { try { var printDocument = new PrintDocument { PrinterSettings = { Copies = this._copies } }; printDocument.PrintPage += ToPrinter; printDocument.PrinterSettings.PrinterName = _printerPath; var paperSize = new PaperSize("A4", Convert.ToInt32(_width / 0.254), Convert.ToInt32(_height / 0.254)); //convert to 100ths of an inch //, 394, 197); printDocument.DefaultPageSettings.PaperSize = paperSize; if (_preview) { var printPreviewDialog = new PrintPreviewDialog { Document = printDocument }; ((ToolStripButton)((ToolStrip)printPreviewDialog.Controls[1]).Items[0]).Enabled = true; printPreviewDialog.ShowDialog(); } else { printDocument.Print(); } } catch (Exception ex){ MessageBox.Show(ex.Message,"Print error"); } } #endregion #region IncrementYCoord private void IncrementYCoord(int height) { _yCoord += height; } #endregion #region toPrinter private void ToPrinter(Object sender, PrintPageEventArgs e) { #region GRAPHICS var graphics = e.Graphics; Brush solidBrush = new SolidBrush(Color.Black); var pen = new Pen(solidBrush, 1); var dashed = new Pen(solidBrush, 1) { DashPattern = new float[] { 3, 1 } }; var rectangle = new Rectangle(275, 765, 250, 250); var date = DateTime.Now; #endregion #region HEADER IncrementYCoord(_lb1); graphics.DrawString("Republic of South Africa", _heading, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Republiek of Suid-Afrika", _heading, solidBrush, 750 - graphics.MeasureString("Republiek of Suid-Afrika", _heading).Width, _yCoord); IncrementYCoord(_lb2); IncrementYCoord(_lb3); graphics.DrawString("CERTIFICATE OF REGISTRATION FOR EHAILING PLATFORM PROVIDERS", _heading, solidBrush, 400 - (graphics.MeasureString("CERTIFICATE OF REGISTRATION FOR EHAILING PLATFORM PROVIDERS", _heading).Width / 2), _yCoord); IncrementYCoord(_lb4); graphics.DrawString("(NATIONAL LAND TRANSPORT AMENDMENT ACT, 2023)", _heading, solidBrush, 400 - (graphics.MeasureString("(NATIONAL LAND TRANSPORT AMENDMENT ACT, 2023)", _heading).Width / 2), _yCoord); IncrementYCoord(_lb4); #endregion #region CERTIFICATE PARTICULARS IncrementYCoord(_lb5); graphics.DrawString("Registering entity", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("National Public Transport Regulator", _heading, solidBrush, 400 - (graphics.MeasureString("National Public Transport Regulator", _heading).Width / 2), _yCoord); graphics.DrawString("Registrasie entiteit", _normal, solidBrush, 750 - graphics.MeasureString("Registrasie entiteit", _normal).Width, _yCoord); IncrementYCoord(_lb6); graphics.DrawString("Business registration number", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString(_businessRegNumber, _heading, solidBrush, 400 - (graphics.MeasureString(_businessRegNumber, _heading).Width / 2), _yCoord); graphics.DrawString("Besigheidsregistrasienommer", _normal, solidBrush, 750 - graphics.MeasureString("Besigheidsregistrasienommer", _normal).Width, _yCoord); IncrementYCoord(_lb7); graphics.DrawString("Name", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString(_legalName, _heading, solidBrush, 400 - (graphics.MeasureString(_legalName, _heading).Width / 2), _yCoord); graphics.DrawString("Naam", _normal, solidBrush, 750 - graphics.MeasureString("Naam", _normal).Width, _yCoord); IncrementYCoord(_lb8); graphics.DrawString("Postal address", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Posdres", _normal, solidBrush, 750 - graphics.MeasureString("Posdres", _normal).Width, _yCoord); if(_registeredAddressLine1 != "") graphics.DrawString(_registeredAddressLine1, _heading, solidBrush, 400 - (graphics.MeasureString(_registeredAddressLine1, _heading).Width / 2), _yCoord); if (_registeredAddressLine2 != "") { IncrementYCoord(_lb9); graphics.DrawString(_registeredAddressLine2, _heading, solidBrush, 400 - (graphics.MeasureString(_registeredAddressLine2, _heading).Width / 2), _yCoord); } if (_registeredAddressCity != "") { IncrementYCoord(_lb10); graphics.DrawString(_registeredAddressCity, _heading, solidBrush, 400 - (graphics.MeasureString(_registeredAddressCity, _heading).Width / 2), _yCoord); } if (_registeredAddressPostalCode != "") { IncrementYCoord(_lb11); graphics.DrawString(_registeredAddressPostalCode, _heading, solidBrush, 400 - (graphics.MeasureString(_registeredAddressPostalCode, _heading).Width / 2), _yCoord); } IncrementYCoord(_lb12); graphics.DrawString("Street address", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Straatadres", _normal, solidBrush, 750 - graphics.MeasureString("Straatadres", _normal).Width, _yCoord); var counter = 0; foreach (var text in _registeredAddressLine1.Split(',')) { counter++; if (counter > 4) continue; graphics.DrawString(text, _heading, solidBrush, 400 - (graphics.MeasureString(text, _heading).Width / 2), _yCoord); IncrementYCoord(_lb13); } graphics.DrawString("Issue number", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString(_issueNumber.ToString().PadLeft(2, '0'), _heading, solidBrush, 400 - (graphics.MeasureString(_issueNumber.ToString().PadLeft(2, '0'), _heading).Width / 2), _yCoord); graphics.DrawString("Uitrekkensnommer", _normal, solidBrush, 750 - graphics.MeasureString("Uitrekkensnommer", _normal).Width, _yCoord); IncrementYCoord(_lb15); graphics.DrawString("Date of issue", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString(_issuedAt, _heading, solidBrush, 400 - (graphics.MeasureString(_issuedAt, _heading).Width / 2), _yCoord); graphics.DrawString("Datum van uitreking", _normal, solidBrush, 750 - graphics.MeasureString("Datum van uitreking", _normal).Width, _yCoord); IncrementYCoord(_lb16); graphics.DrawString("Receipt number", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString(_receiptNumber, _heading, solidBrush, 400 - (graphics.MeasureString(_receiptNumber, _heading).Width / 2), _yCoord); graphics.DrawString("Kwitansie nommer", _normal, solidBrush, 750 - graphics.MeasureString("Kwitansie nommer", _normal).Width, _yCoord); IncrementYCoord(_lb17); graphics.DrawString("Transaction", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Registration as E-hailing APP", _heading, solidBrush, 400 - (graphics.MeasureString("Registration as E-hailing APP", _heading).Width / 2), _yCoord); IncrementYCoord(_lb18); graphics.DrawString("provider", _heading, solidBrush, 400 - (graphics.MeasureString("provider", _heading).Width / 2), _yCoord); #endregion #region IMPORTANT NOTIFICATION / BELANGRIKE INLIGTING IncrementYCoord(_lb19); graphics.DrawString("IMPORTANT NOTIFICATION", _heading, solidBrush, _leftMargin, _yCoord); graphics.DrawString("BELANGRIKE INLIGTING", _heading, solidBrush, 750 - graphics.MeasureString("BELANGRIKE INLIGTING", _normal).Width, _yCoord); IncrementYCoord(_lb20); graphics.DrawString("The certificate is deemed to be the", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Die sertifikaat word geag die", _normal, solidBrush, 750 - graphics.MeasureString("Die sertifikaat word geag die", _normal).Width, _yCoord); IncrementYCoord(_lb21); graphics.DrawString("identity document of the mentioned", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("identiteitsdokument van die", _normal, solidBrush, 750 - graphics.MeasureString("identiteitsdokument van die", _normal).Width, _yCoord); IncrementYCoord(_lb22); graphics.DrawString("entity for the of the National Land", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("genoemde entiteit te wees vir die", _normal, solidBrush, 750 - graphics.MeasureString("genoemde entiteit te wees vir die", _normal).Width, _yCoord); IncrementYCoord(_lb23); graphics.DrawString("Transport Amendment Act, 2023", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("toepassing van die Nasionale", _normal, solidBrush, 750 - graphics.MeasureString("toepassing van die Nasionale", _normal).Width, _yCoord); IncrementYCoord(_lb24); graphics.DrawString("(Act. no. 23 of 2023)", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Wysigingswet op Landvervoer, 2023", _normal, solidBrush, 750 - graphics.MeasureString("Wysigingswet op Landvervoer, 2023", _normal).Width, _yCoord); IncrementYCoord(_lb24); graphics.DrawString("(Wet nr. 23 van 2023).", _normal, solidBrush, 750 - graphics.MeasureString("(Wet nr. 23 van 2023).", _normal).Width, _yCoord); IncrementYCoord(_lb25); graphics.DrawString("The certificate must be kept in a safe", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Die sertifikaat moet op 'n veilig plek", _normal, solidBrush, 750 - graphics.MeasureString("Die sertifikaat moet op 'n veilig plek", _normal).Width, _yCoord); IncrementYCoord(_lb26); graphics.DrawString("place and produced when required", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("gehou word en getoon word wanneer", _normal, solidBrush, 750 - graphics.MeasureString("gehou word en getoon word wanneer", _normal).Width, _yCoord); IncrementYCoord(_lb27); graphics.DrawString("in terms of the National Land", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("dit vereis word ingevolge die", _normal, solidBrush, 750 - graphics.MeasureString("dit vereis word ingevolge die", _normal).Width, _yCoord); IncrementYCoord(_lb28); graphics.DrawString("Transport Amendment Act", _normal, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Nasionale Wysigingswet op", _normal, solidBrush, 750 - graphics.MeasureString("Nasionale Wysigingswet op", _normal).Width, _yCoord); IncrementYCoord(_lb28); graphics.DrawString("Landvervoer", _normal, solidBrush, 750 - graphics.MeasureString("Landvervoer", _normal).Width, _yCoord); IncrementYCoord(_lb29); graphics.DrawLine(pen, _leftMargin, _yCoord, _leftMargin + 300, _yCoord); graphics.DrawLine(pen, _leftMargin + 430, _yCoord, _leftMargin + 630, _yCoord); IncrementYCoord(_lb30); graphics.DrawString("Chairperson", _heading, solidBrush, _leftMargin, _yCoord); graphics.DrawString("Date", _heading, solidBrush, _leftMargin + 430, _yCoord); #endregion #region Test Watermark if (_isTest) { graphics.TranslateTransform(150, 75); graphics.RotateTransform(e.PageSettings.Landscape ? 30 : 45); graphics.DrawString("TEST PAGE", new Font("Arial", 100, FontStyle.Bold), new SolidBrush(Color.FromArgb(64, Color.Black)), 0, 0); } #endregion } #endregion #region Get2LineDisplayText private static string Get2LineDisplayText(string original) { //Degenerate case with only 1 word if (!original.Any(Char.IsWhiteSpace)) { return original; } var mid = original.Length / 2; if (!Char.IsWhiteSpace(original[mid])) { for (var i = 1; i < mid; i += i) { if (Char.IsWhiteSpace(original[mid + i])) { mid = mid + i; break; } if (!Char.IsWhiteSpace(original[mid - i])) continue; mid = mid - i; break; } } return original.Substring(0, mid) + "," + original.Substring(mid + 1); } #endregion } }