Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Drawing;
- using System.Drawing.Printing;
- using System.IO;
- using System.Runtime.InteropServices;
- using System.Text;
- public class RawPrinterHelper
- {
- public static void Main()
- {
- byte[] Array = ConvertToByteArray("Druck mich bitte bitte Ich hab keine Lust nicht gedruckt zu werden!\n", Encoding.ASCII);
- string stuff = Formatio(Array);
- byte[] Binary = ConvertToByteArray(stuff, Encoding.ASCII);
- IntPtr unmanagedPointer = Marshal.AllocHGlobal(Binary.Length);
- Marshal.Copy(Binary, 0, unmanagedPointer, Binary.Length);
- // Call unmanaged code
- Int32 Counter = Binary.Length;
- /*
- if(SendBytesToPrinter("MyPrinter",unmanagedPointer, Counter) != false)
- {
- Console.WriteLine("HOORAY!");
- }
- else
- {
- Console.WriteLine("BOOOOH");
- }
- Marshal.FreeHGlobal(unmanagedPointer);
- */
- }
- // 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, Int32 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, Int32 dwCount, out Int32 dwWritten);
- // SendBytesToPrinter()
- // When the function is given a printer name and an unmanaged array
- // of bytes, the function sends those bytes to the print queue.
- // Returns true on success, false on failure.
- public static byte[] ConvertToByteArray(string str, Encoding encoding)
- {
- return encoding.GetBytes(str);
- }
- //Formats a byte[] into a binary string (010010010010100101010)
- public static string Formatio(byte[] data)
- {
- //storage for the resulting string
- string result = string.Empty;
- //iterate through the byte[]
- foreach (byte value in data)
- {
- //storage for the individual byte
- string binarybyte = Convert.ToString(value, 2);
- //if the binarybyte is not 8 characters long, its not a proper result
- while (binarybyte.Length < 8)
- {
- //prepend the value with a 0
- binarybyte = "0" + binarybyte;
- }
- //append the binarybyte to the result
- result += binarybyte;
- }
- //return the result
- return result;
- }
- public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
- {
- Int32 dwError = 0, dwWritten = 0;
- IntPtr hPrinter = new IntPtr(0);
- DOCINFOA di = new DOCINFOA();
- bool bSuccess = false; // Assume failure unless you specifically succeed.
- di.pDocName = "My C#.NET RAW Document";
- di.pDataType = "RAW";
- // Open the printer.
- if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
- {
- // Start a document.
- if (StartDocPrinter(hPrinter, 1, di))
- {
- // Start a page.
- if (StartPagePrinter(hPrinter))
- {
- // Write your bytes.
- bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
- EndPagePrinter(hPrinter);
- }
- EndDocPrinter(hPrinter);
- }
- ClosePrinter(hPrinter);
- }
- // If you did not succeed, GetLastError may give more information
- // about why not.
- if (bSuccess == false)
- {
- dwError = Marshal.GetLastWin32Error();
- }
- return bSuccess;
- }
- public static bool SendFileToPrinter(string szPrinterName, string szFileName)
- {
- // Open the file.
- FileStream fs = new FileStream(szFileName, FileMode.Open);
- // Create a BinaryReader on the file.
- BinaryReader br = new BinaryReader(fs);
- // Dim an array of bytes big enough to hold the file's contents.
- Byte[] bytes = new Byte[fs.Length];
- bool bSuccess = false;
- // Your unmanaged pointer.
- IntPtr pUnmanagedBytes = new IntPtr(0);
- int nLength;
- nLength = Convert.ToInt32(fs.Length);
- // Read the contents of the file into the array.
- bytes = br.ReadBytes(nLength);
- // Allocate some unmanaged memory for those bytes.
- pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
- // Copy the managed byte array into the unmanaged array.
- Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
- // Send the unmanaged bytes to the printer.
- bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
- // Free the unmanaged memory that you allocated earlier.
- Marshal.FreeCoTaskMem(pUnmanagedBytes);
- return bSuccess;
- }
- public static bool SendStringToPrinter(string szPrinterName, string szString)
- {
- IntPtr pBytes;
- Int32 dwCount;
- // How many characters are in the string?
- // Fix from Nicholas Piasecki:
- // dwCount = szString.Length;
- dwCount = (szString.Length + 1) * Marshal.SystemMaxDBCSCharSize;
- // Assume that the printer is expecting ANSI text, and then convert
- // the string to ANSI text.
- pBytes = Marshal.StringToCoTaskMemAnsi(szString);
- // Send the converted ANSI string to the printer.
- SendBytesToPrinter(szPrinterName, pBytes, dwCount);
- Marshal.FreeCoTaskMem(pBytes);
- return true;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement