Print to POS printer - Problem cutting paper in VB.NET

Hello all,

Im printing on a POS receipt printer as follows (VB.NET):

args.Graphics.DrawString("Hello World", New Font("Arial", 8, FontStyle.Regular), Brushes.Red, 0,0)

but when trying to cut the paper, its not working:

Const ESC = Chr(27)
Dim strCut As String
strCut = ESC & "i"
args.Graphics.DrawString(strCut, New Font("Arial", 8, FontStyle.Regular), Brushes.Red, 0, 0)

The manual say the following:

Partial cut
Code: ASCII ESC i
Hex 1B 69
Decimal 27 105

This command executes a partial cut of the paper with one point left uncut.
The same partial cut as this command is executed using ESC m and GS V.

That's why I set strCut as ESC + "i"

But aint working....

Any tips? Thanks!
pvg1975Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

CodeCruiserCommented:
You need to send that character to the printer not print it. With drawstring, that character is being DRAWN. You need to send the characters to printer. Try using the RawPrinterHelper class

http://support.microsoft.com/kb/322091

http://www.codeproject.com/Answers/169800/Print-and-send-commands-to-receipt-printer.aspx#answer1 
0
pvg1975Author Commented:
Any way to do that in VB.NET?
0
CodeCruiserCommented:
Add following code

 
Public Class RawPrinterHelper
	' Structure and API declarions:
	<StructLayout(LayoutKind.Sequential, CharSet := CharSet.Ansi)> _
	Public Class DOCINFOA
		<MarshalAs(UnmanagedType.LPStr)> _
		Public pDocName As String
		<MarshalAs(UnmanagedType.LPStr)> _
		Public pOutputFile As String
		<MarshalAs(UnmanagedType.LPStr)> _
		Public pDataType As String
	End Class
	<DllImport("winspool.Drv", EntryPoint := "OpenPrinterA", SetLastError := True, CharSet := CharSet.Ansi, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> szPrinter As String, ByRef hPrinter As IntPtr, pd As IntPtr) As Boolean
	End Function

	<DllImport("winspool.Drv", EntryPoint := "ClosePrinter", SetLastError := True, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function ClosePrinter(hPrinter As IntPtr) As Boolean
	End Function

	<DllImport("winspool.Drv", EntryPoint := "StartDocPrinterA", SetLastError := True, CharSet := CharSet.Ansi, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function StartDocPrinter(hPrinter As IntPtr, level As Int32, <[In], MarshalAs(UnmanagedType.LPStruct)> di As DOCINFOA) As Boolean
	End Function

	<DllImport("winspool.Drv", EntryPoint := "EndDocPrinter", SetLastError := True, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function EndDocPrinter(hPrinter As IntPtr) As Boolean
	End Function

	<DllImport("winspool.Drv", EntryPoint := "StartPagePrinter", SetLastError := True, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function StartPagePrinter(hPrinter As IntPtr) As Boolean
	End Function

	<DllImport("winspool.Drv", EntryPoint := "EndPagePrinter", SetLastError := True, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function EndPagePrinter(hPrinter As IntPtr) As Boolean
	End Function

	<DllImport("winspool.Drv", EntryPoint := "WritePrinter", SetLastError := True, ExactSpelling := True, CallingConvention := CallingConvention.StdCall)> _
	Public Shared Function WritePrinter(hPrinter As IntPtr, pBytes As IntPtr, dwCount As Int32, ByRef dwWritten As Int32) As Boolean
	End Function

	' 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 Shared Function SendBytesToPrinter(szPrinterName As String, pBytes As IntPtr, dwCount As Int32) As Boolean
		Dim dwError As Int32 = 0, dwWritten As Int32 = 0
		Dim hPrinter As New IntPtr(0)
		Dim di As New DOCINFOA()
		Dim bSuccess As Boolean = False
		' Assume failure unless you specifically succeed.
		di.pDocName = "My C#.NET RAW Document"
		di.pDataType = "RAW"

		' Open the printer.
		If OpenPrinter(szPrinterName.Normalize(), hPrinter, IntPtr.Zero) Then
			' Start a document.
			If StartDocPrinter(hPrinter, 1, di) Then
				' Start a page.
				If StartPagePrinter(hPrinter) Then
					' Write your bytes.
					bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)
					EndPagePrinter(hPrinter)
				End If
				EndDocPrinter(hPrinter)
			End If
			ClosePrinter(hPrinter)
		End If
		' If you did not succeed, GetLastError may give more information
		' about why not.
		If bSuccess = False Then
			dwError = Marshal.GetLastWin32Error()
		End If
		Return bSuccess
	End Function

	Public Shared Function SendFileToPrinter(szPrinterName As String, szFileName As String) As Boolean
		' Open the file.
		Dim fs As New FileStream(szFileName, FileMode.Open)
		' Create a BinaryReader on the file.
		Dim br As New BinaryReader(fs)
		' Dim an array of bytes big enough to hold the file's contents.
		Dim bytes As [Byte]() = New [Byte](fs.Length - 1) {}
		Dim bSuccess As Boolean = False
		' Your unmanaged pointer.
		Dim pUnmanagedBytes As New IntPtr(0)
		Dim nLength As Integer

		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
	End Function
	Public Shared Function SendStringToPrinter(szPrinterName As String, szString As String) As Boolean
		Dim pBytes As IntPtr
		Dim dwCount As Int32
		' 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
	End Function
End Class

Open in new window




Then use

RawPrinterHelper.SendStringToPrinter("printer name", yourkeycodes)
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
pvg1975Author Commented:
Sorry for the delay in my answer... it worked. Thanks!!!
0
CodeCruiserCommented:
Glad to help :-)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.