123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- * LPrinter - A simple line printer class in C#
- * ============================================
- *
- * Written by Antonino Porcino, iz8bly@yahoo.it
- *
- * 26-sep-2008, public domain.
- *
- *
- * some useful print codes:
- * ========================
- * 12 = FF (form feed)
- * 14 = enlarged on
- * 20 = enlarged off
- * 15 = compress on
- * 18 = compress off
- * ESC + "E" = bold on
- * ESC + "F" = bold off
- */
- using System;
- using System.Drawing.Printing;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Windows.Forms;
- namespace LinePrinterPoC
- {
- internal class LinePrinter
- {
- // Structure and API declarions:
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
- public class DOCINFOA
- {
- [MarshalAs(UnmanagedType.LPStr)]
- public string pDocName;
- [MarshalAs(UnmanagedType.LPStr)]
- public string pOutputFile;
- [MarshalAs(UnmanagedType.LPStr)]
- public string pDataType;
- }
- [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
- [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool ClosePrinter(IntPtr hPrinter);
- [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool StartDocPrinter(IntPtr hPrinter, int level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
- [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool EndDocPrinter(IntPtr hPrinter);
- [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool StartPagePrinter(IntPtr hPrinter);
- [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool EndPagePrinter(IntPtr hPrinter);
- [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
- public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, out int dwWritten);
- /*=================================================*/
- private IntPtr HandlePrinter;
- private PrinterSettings ps;
- public LinePrinter()
- {
- HandlePrinter = IntPtr.Zero;
- ps = new PrinterSettings();
- }
- public string PrinterName
- {
- get
- {
- return ps.PrinterName;
- }
- set
- {
- ps.PrinterName = value;
- }
- }
- public bool ChoosePrinter(IWin32Window parent = null)
- {
- var pd = new PrintDialog
- {
- PrinterSettings = ps
- };
- if (pd.ShowDialog(parent) != DialogResult.OK)
- return false;
- ps = pd.PrinterSettings;
- return true;
- }
- public bool Open(string docName)
- {
- // see if printer is already open
- if (HandlePrinter != IntPtr.Zero) return false;
- // opens the printer
- var risp = OpenPrinter(ps.PrinterName, out HandlePrinter, IntPtr.Zero);
- if (risp == false) return false;
- // starts a print job
- var docInfo = new DOCINFOA
- {
- pDocName = docName,
- pOutputFile = null,
- pDataType = "RAW"
- };
- if (!StartDocPrinter(HandlePrinter, 1, docInfo))
- return false;
- StartPagePrinter(HandlePrinter); //starts a page
- return true;
- }
- public bool Close()
- {
- if (HandlePrinter == IntPtr.Zero) return false;
- if (!EndPagePrinter(HandlePrinter)) return false;
- if (!EndDocPrinter(HandlePrinter)) return false;
- if (!ClosePrinter(HandlePrinter)) return false;
- HandlePrinter = IntPtr.Zero;
- return true;
- }
- public bool Print(string outputstring)
- {
- if (HandlePrinter == IntPtr.Zero) return false;
- IntPtr buf = Marshal.StringToCoTaskMemAnsi(outputstring);
- Int32 done;
- bool ok = WritePrinter(HandlePrinter, buf, Encoding.Default.GetByteCount(outputstring), out done);
- Marshal.FreeCoTaskMem(buf);
- return ok;
- }
- }
- }
|