LinePrinter.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * LPrinter - A simple line printer class in C#
  3. * ============================================
  4. *
  5. * Written by Antonino Porcino, iz8bly@yahoo.it
  6. *
  7. * 26-sep-2008, public domain.
  8. *
  9. *
  10. * some useful print codes:
  11. * ========================
  12. * 12 = FF (form feed)
  13. * 14 = enlarged on
  14. * 20 = enlarged off
  15. * 15 = compress on
  16. * 18 = compress off
  17. * ESC + "E" = bold on
  18. * ESC + "F" = bold off
  19. */
  20. using System;
  21. using System.Drawing.Printing;
  22. using System.Runtime.InteropServices;
  23. using System.Text;
  24. using System.Windows.Forms;
  25. namespace LinePrinterPoC
  26. {
  27. internal class LinePrinter
  28. {
  29. // Structure and API declarions:
  30. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  31. public class DOCINFOA
  32. {
  33. [MarshalAs(UnmanagedType.LPStr)]
  34. public string pDocName;
  35. [MarshalAs(UnmanagedType.LPStr)]
  36. public string pOutputFile;
  37. [MarshalAs(UnmanagedType.LPStr)]
  38. public string pDataType;
  39. }
  40. [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  41. public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
  42. [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  43. public static extern bool ClosePrinter(IntPtr hPrinter);
  44. [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  45. public static extern bool StartDocPrinter(IntPtr hPrinter, int level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
  46. [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  47. public static extern bool EndDocPrinter(IntPtr hPrinter);
  48. [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  49. public static extern bool StartPagePrinter(IntPtr hPrinter);
  50. [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  51. public static extern bool EndPagePrinter(IntPtr hPrinter);
  52. [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  53. public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, out int dwWritten);
  54. /*=================================================*/
  55. private IntPtr HandlePrinter;
  56. private PrinterSettings ps;
  57. public LinePrinter()
  58. {
  59. HandlePrinter = IntPtr.Zero;
  60. ps = new PrinterSettings();
  61. }
  62. public string PrinterName
  63. {
  64. get
  65. {
  66. return ps.PrinterName;
  67. }
  68. set
  69. {
  70. ps.PrinterName = value;
  71. }
  72. }
  73. public bool ChoosePrinter(IWin32Window parent = null)
  74. {
  75. var pd = new PrintDialog
  76. {
  77. PrinterSettings = ps
  78. };
  79. if (pd.ShowDialog(parent) != DialogResult.OK)
  80. return false;
  81. ps = pd.PrinterSettings;
  82. return true;
  83. }
  84. public bool Open(string docName)
  85. {
  86. // see if printer is already open
  87. if (HandlePrinter != IntPtr.Zero) return false;
  88. // opens the printer
  89. var risp = OpenPrinter(ps.PrinterName, out HandlePrinter, IntPtr.Zero);
  90. if (risp == false) return false;
  91. // starts a print job
  92. var docInfo = new DOCINFOA
  93. {
  94. pDocName = docName,
  95. pOutputFile = null,
  96. pDataType = "RAW"
  97. };
  98. if (!StartDocPrinter(HandlePrinter, 1, docInfo))
  99. return false;
  100. StartPagePrinter(HandlePrinter); //starts a page
  101. return true;
  102. }
  103. public bool Close()
  104. {
  105. if (HandlePrinter == IntPtr.Zero) return false;
  106. if (!EndPagePrinter(HandlePrinter)) return false;
  107. if (!EndDocPrinter(HandlePrinter)) return false;
  108. if (!ClosePrinter(HandlePrinter)) return false;
  109. HandlePrinter = IntPtr.Zero;
  110. return true;
  111. }
  112. public bool Print(string outputstring)
  113. {
  114. if (HandlePrinter == IntPtr.Zero) return false;
  115. IntPtr buf = Marshal.StringToCoTaskMemAnsi(outputstring);
  116. Int32 done;
  117. bool ok = WritePrinter(HandlePrinter, buf, Encoding.Default.GetByteCount(outputstring), out done);
  118. Marshal.FreeCoTaskMem(buf);
  119. return ok;
  120. }
  121. }
  122. }