Direct Print c# VS 2008

Joined
May 19, 2010
Messages
1
Reaction score
0
Hi,
I read a lot of posts about the direct printing with win API, i dont know if my code its wrong or im missing something i hope you can help me. I made 3 options: Print a File, print a string and print a stream, but when i use anyone the app sent the object to print but the printer doesnt print anything! :(.
This is my code:
Code:
   private void PrintFile_Click(object sender, EventArgs e)
  		{
  			// Allow the user to select a file.
  			OpenFileDialog ofd = new OpenFileDialog();
  			if (DialogResult.OK == ofd.ShowDialog(this))
  			{
  				// Allow the user to select a printer.
  				PrintDialog pd = new PrintDialog();
  				pd.PrinterSettings = new PrinterSettings();
  				if (DialogResult.OK == pd.ShowDialog(this))
  				{
  					// Print the file to the printer.
  					PrintingPermission perm = new PrintingPermission(System.Security.Permissions.PermissionState.Unrestricted);
  					perm.Level = PrintingPermissionLevel.AllPrinting;
  					
  					RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);
  				}
  			}
  		}
  
  		private void PrintString_Click(object sender, EventArgs e)
  		{
  			string s = "Hello"; // device-dependent string, need a FormFeed?
  
  			// Allow the user to select a printer.
  			PrintDialog pd = new PrintDialog();
  			pd.PrinterSettings = new PrinterSettings();
  			if (DialogResult.OK == pd.ShowDialog(this))
  			{
  				// Send a printer-specific to the printer.
  				RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
  			}
  
  		}
  
  		private void PrintStream_Click(object sender, EventArgs e)
  		{
  			MemoryStream memStrm = new MemoryStream();
  			StreamWriter sw = new StreamWriter(memStrm);
  			sw.WriteLine("\x02L");
  			sw.WriteLine("H07");
  			sw.WriteLine("D11");
  			sw.WriteLine("19110080200002510K Ny linje");
  			sw.WriteLine("19110080100002510K OHM 1/4 WATT");
  			sw.Flush();
  			sw.WriteLine("1a6210000000050590PCS");
  			sw.WriteLine("E");
  			sw.WriteLine("");
  			sw.Flush();
  
  			memStrm.Position = 0;
  			PrintDialog pd = new PrintDialog();
  			pd.PrinterSettings = new PrinterSettings();
  			if (DialogResult.OK == pd.ShowDialog(this))
  			{
  				// Send a printer-specific to the printer.
  				RawPrinterHelper.SendStreamToPrinter(pd.PrinterSettings.PrinterName, memStrm);
  			}
  			sw.Close();
  		}
  
  	}
  
  	public class RawPrinterHelper
  	{
  		// 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 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 = "Test Label Print LINKS";
  			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 SendStreamToPrinter(string szPrinterName, MemoryStream szStream)
  		{
  			// Open the file.
  			//FileStream fs = new FileStream(szFileName, FileMode.Open);
  			// Create a BinaryReader on the file.
  			BinaryReader br = new BinaryReader(szStream);
  			// Dim an array of bytes big enough to hold the file's contents.
  			Byte[] bytes = new Byte[szStream.Length];
  			bool bSuccess = false;
  			// Your unmanaged pointer.
  			IntPtr pUnmanagedBytes = new IntPtr(0);
  			int nLength;
  
  			nLength = Convert.ToInt32(szStream.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.
  			System.Threading.Thread.Sleep(5000);
  			Marshal.FreeCoTaskMem(pUnmanagedBytes);
  			return bSuccess;
  		}
  
  		public static bool SendStringToPrinter(string szPrinterName, string szString)
  		{
  			IntPtr pBytes;
  			Int32 dwCount;
  			// How many characters are in the string?
  			dwCount = szString.Length;
  			// 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;
  		}
  	}

i really hope someone can help me :D

Best Regards
Thx for your time :)
 
Back
Top