説明なし

Printer.cs 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Printing;
  4. using System.Windows.Forms;
  5. using System.Runtime.InteropServices;
  6. using System.Collections.Generic;
  7. namespace BulkPrinting
  8. {
  9. public class Printer
  10. {
  11. public const string UNIDIRECTIONAL_ON = "\x1B\x55\x31";
  12. public const string UNIDIRECTIONAL_OFF = "\x1B\x55\x30";
  13. public const string CR = "\x0d";
  14. public const string LF = "\x0a";
  15. public const string FORMFEED = "\x0c";
  16. public const string LINESPACE18 = "\x1B\x30";
  17. public const string LINESPACE772 = "\x1B\x31";
  18. public const string CHARPITCHS1 = "\x1B\x37";
  19. public const string CHARPITCHS2 = "\x1B\x36";
  20. public const string CHARPITCHPUB = "\x1B\x21\x5a";
  21. public const string CHARPITCHS0 = "\x1B\x21\x40";
  22. public const string CHARPITCHPICO = "\x1B\x50";
  23. public const string CHARPITCHELITE = "\x1B\x4D";
  24. public const string CONDENSED = "\x1B\x0F";
  25. public const string INITIALISE_PRINTER = "\x1B\x40";
  26. public const string EMPHASISE_ON = "\x1B\x45";
  27. public const string EMPHASISE_OFF = "\x1B\x46";
  28. public const int JOB_CONTROL_DELETE = 5;
  29. // Structure and API declarions:
  30. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  31. public class DOCINFOA
  32. {
  33. [MarshalAs(UnmanagedType.LPStr)] public string pDocName;
  34. [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;
  35. [MarshalAs(UnmanagedType.LPStr)] public string pDataType;
  36. }
  37. [StructLayout(LayoutKind.Sequential)]
  38. private struct SYSTEMTIME
  39. {
  40. Int16 wYear;
  41. Int16 wMonth;
  42. Int16 wDayOfWeek;
  43. Int16 wDay;
  44. Int16 wHour;
  45. Int16 wMinute;
  46. Int16 wSecond;
  47. Int16 wMilliseconds;
  48. }
  49. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  50. struct JOB_INFO_1
  51. {
  52. public UInt32 JobId;
  53. [MarshalAs(UnmanagedType.LPStr)] public string pPrinterName;
  54. [MarshalAs(UnmanagedType.LPStr)] public string pMachineName;
  55. [MarshalAs(UnmanagedType.LPStr)] public string pUserName;
  56. [MarshalAs(UnmanagedType.LPStr)] public string pDocument;
  57. [MarshalAs(UnmanagedType.LPStr)] public string pDatatype;
  58. [MarshalAs(UnmanagedType.LPStr)] public string pStatus;
  59. public UInt32 Status;
  60. public UInt32 Priority;
  61. public UInt32 Position;
  62. public UInt32 TotalPages;
  63. public UInt32 PagesPrinted;
  64. public SYSTEMTIME Submitted;
  65. }
  66. [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  67. public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
  68. [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  69. public static extern bool ClosePrinter(IntPtr hPrinter);
  70. [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  71. public static extern int StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
  72. [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  73. public static extern bool EndDocPrinter(IntPtr hPrinter);
  74. [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  75. public static extern bool StartPagePrinter(IntPtr hPrinter);
  76. [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  77. public static extern bool EndPagePrinter(IntPtr hPrinter);
  78. [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  79. public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
  80. [DllImport("winspool.drv", EntryPoint = "GetJobA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  81. private static extern bool GetJob(IntPtr hPrinter, Int32 JobId, Int32 Level, out byte[] pJob, Int32 cbBuf, out Int32 pcbNeeded);
  82. [DllImport("winspool.drv", EntryPoint = "SetJobA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  83. private static extern bool SetJob(IntPtr hPrinter, int JobId, int Level, out byte pJob, int Command_Renamed);
  84. /*=================================================*/
  85. private IntPtr HandlePrinter;
  86. private PrinterSettings ps;
  87. public Printer()
  88. {
  89. HandlePrinter = IntPtr.Zero;
  90. ps = new PrinterSettings();
  91. }
  92. public string PrinterName
  93. {
  94. get
  95. {
  96. return ps.PrinterName;
  97. }
  98. set
  99. {
  100. ps.PrinterName = value;
  101. }
  102. }
  103. public bool ChoosePrinter()
  104. {
  105. PrintDialog pd = new PrintDialog();
  106. pd.UseEXDialog = true; //Required for AMD64 based processors
  107. pd.PrinterSettings = ps;
  108. if (pd.ShowDialog() == DialogResult.OK)
  109. {
  110. ps = pd.PrinterSettings;
  111. return true;
  112. }
  113. else
  114. return false;
  115. }
  116. public bool GetJobInfo(int JobID)
  117. {
  118. //JOB_INFO_1 JobInfo = new JOB_INFO_1();
  119. byte[] JobInfoByte;
  120. int pcbNeeded;
  121. if (HandlePrinter == IntPtr.Zero) return false;
  122. GetJob(HandlePrinter, JobID, 1, out JobInfoByte, 240, out pcbNeeded);
  123. return false;
  124. }
  125. public int Open(string DocName)
  126. {
  127. // see if printer is already open
  128. if (HandlePrinter != IntPtr.Zero) return 0;
  129. // opens the printer
  130. bool risp = OpenPrinter(ps.PrinterName, out HandlePrinter, IntPtr.Zero);
  131. if (risp == false) return 0;
  132. // starts a print job
  133. DOCINFOA MyDocInfo = new DOCINFOA();
  134. MyDocInfo.pDocName = DocName;
  135. MyDocInfo.pOutputFile = null;
  136. MyDocInfo.pDataType = "RAW";
  137. int JobID = StartDocPrinter(HandlePrinter, 1, MyDocInfo);
  138. if (JobID > 0)
  139. {
  140. StartPagePrinter(HandlePrinter); //starts a page
  141. }
  142. return JobID;
  143. }
  144. public bool Close()
  145. {
  146. if (HandlePrinter == IntPtr.Zero) return false;
  147. if (!EndPagePrinter(HandlePrinter)) return false;
  148. if (!EndDocPrinter(HandlePrinter)) return false;
  149. if (!ClosePrinter(HandlePrinter)) return false;
  150. HandlePrinter = IntPtr.Zero;
  151. return true;
  152. }
  153. public bool Print(string outputstring)
  154. {
  155. if (HandlePrinter == IntPtr.Zero) return false;
  156. IntPtr buf = Marshal.StringToCoTaskMemAnsi(outputstring);
  157. Int32 done = 0;
  158. bool ok = WritePrinter(HandlePrinter, buf, outputstring.Length, out done);
  159. Marshal.FreeCoTaskMem(buf);
  160. if (!ok) return false;
  161. else return true;
  162. }
  163. public void NewPage()
  164. {
  165. EndPagePrinter(HandlePrinter);
  166. StartPagePrinter(HandlePrinter);
  167. }
  168. /****************************************************************************************************************************/
  169. private static PrintDocument pdoc = null;
  170. private static List<OrderList> OrderReportList;
  171. private static int ListLoc = 0;
  172. public static void PrintOrderReport(List<OrderList> OrderPrintList)
  173. {
  174. ListLoc = 0;
  175. OrderReportList = OrderPrintList;
  176. PrintDialog pd = new PrintDialog();
  177. pd.UseEXDialog = true; //Required for AMD64 based processors
  178. pdoc = new PrintDocument();
  179. PrinterSettings ps = new PrinterSettings();
  180. Font font = new Font("Courier New", 15);
  181. PaperSize psize = new PaperSize("Custom", 100, 200);
  182. pd.Document = pdoc;
  183. pd.Document.DefaultPageSettings.PaperSize = psize;
  184. pdoc.DefaultPageSettings.PaperSize.Height = 820;
  185. pdoc.DefaultPageSettings.PaperSize.Width = 520;
  186. pdoc.PrintPage += new PrintPageEventHandler(pdoc_PrintPage);
  187. DialogResult result = pd.ShowDialog();
  188. if (result == DialogResult.OK)
  189. {
  190. pdoc.DefaultPageSettings.PrinterSettings.PrintRange = pd.PrinterSettings.PrintRange;
  191. /*
  192. PrintPreviewDialog pp = new PrintPreviewDialog();
  193. pp.Document = pdoc;
  194. result = pp.ShowDialog();
  195. if (result == DialogResult.OK)
  196. {
  197. */
  198. pdoc.Print();
  199. //}
  200. }
  201. }
  202. class Columns
  203. {
  204. public static int OrderDate = 0;
  205. public static int OrderReference = 90;
  206. public static int User = 170;
  207. public static int OrderItems = 290;
  208. public static int QtyOrdered = 430;
  209. public static int QtyDelivered = 500;
  210. public static int Cost = 580;
  211. public static int Balance = 630;
  212. }
  213. public static void pdoc_PrintPage(object sender, PrintPageEventArgs e)
  214. {
  215. //Header
  216. Graphics graphics = e.Graphics;
  217. Font font = new Font("Arial", 10);
  218. float fontHeight = font.GetHeight();
  219. int startX = 50;
  220. int startY = 55;
  221. int Offset = 40;
  222. var a = Globals.SessionData.AccessToken;
  223. graphics.DrawString("R-Group Order Report", new Font("Arial", 28), new SolidBrush(Color.Black), startX, startY + Offset);
  224. graphics.DrawString(Globals.SessionData.Credentials.Payload.User.Account.Name, new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + 500, startY + Offset);
  225. graphics.DrawString(Globals.SessionData.Credentials.Payload.User.FirstName + " " + Globals.SessionData.Credentials.Payload.User.Surname, new Font("Arial", 10), new SolidBrush(Color.Black), startX + 500, startY + Offset + 20);
  226. graphics.DrawString(DateTime.Now.ToString(), new Font("Arial", 10), new SolidBrush(Color.Black), startX + 500, startY + Offset + 40);
  227. Offset = Offset + 90;
  228. graphics.DrawString("Date", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.OrderDate, startY + Offset);
  229. graphics.DrawString("Reference", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.OrderReference, startY + Offset);
  230. graphics.DrawString("User", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.User, startY + Offset);
  231. graphics.DrawString("Items", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.OrderItems, startY + Offset);
  232. graphics.DrawString("Ordered", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.QtyOrdered, startY + Offset);
  233. graphics.DrawString("Delivered", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.QtyDelivered, startY + Offset);
  234. graphics.DrawString("Cost", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.Cost, startY + Offset);
  235. graphics.DrawString("Balance", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.Balance, startY + Offset);
  236. graphics.DrawLine(new Pen(Color.Black, 2), new Point(startX, startY + Offset + 20), new Point(startX + 700, startY + Offset + 20));
  237. Offset = Offset + 10;
  238. while (ListLoc < OrderReportList.Count)
  239. {
  240. Offset = Offset + 40;
  241. graphics.DrawString(OrderReportList[ListLoc].OrderDate, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.OrderDate, startY + Offset);
  242. graphics.DrawString(OrderReportList[ListLoc].OrderReference, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.OrderReference, startY + Offset);
  243. graphics.DrawString(OrderReportList[ListLoc].User, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.User, startY + Offset);
  244. foreach (OrderReportLine OrderLine in OrderReportList[ListLoc].OrderLines)
  245. {
  246. graphics.DrawString(OrderLine.OrderItem, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.OrderItems, startY + Offset);
  247. graphics.DrawString(OrderLine.QtyOrdered, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.QtyOrdered, startY + Offset);
  248. graphics.DrawString(OrderLine.QtyDelivered, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.QtyDelivered, startY + Offset);
  249. graphics.DrawString(OrderLine.Cost, new Font("Arial", 10), new SolidBrush(Color.Black), startX + Columns.Cost, startY + Offset);
  250. Offset = Offset + 20;
  251. }
  252. graphics.DrawString("Total", new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.QtyDelivered, startY + Offset);
  253. graphics.DrawString(OrderReportList[ListLoc].OrderCost, new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.Cost, startY + Offset);
  254. graphics.DrawString(OrderReportList[ListLoc].Balance, new Font("Arial", 10, FontStyle.Bold), new SolidBrush(Color.Black), startX + Columns.Balance, startY + Offset);
  255. ListLoc += 1;
  256. if (Offset > 800)
  257. {
  258. Offset = 50;
  259. e.HasMorePages = true;
  260. continue;
  261. }
  262. }
  263. }
  264. }
  265. }