Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3047
  • Last Modified:

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!
0
pvg1975
Asked:
pvg1975
  • 3
  • 2
1 Solution
 
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
 
pvg1975Author Commented:
Sorry for the delay in my answer... it worked. Thanks!!!
0
 
CodeCruiserCommented:
Glad to help :-)
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now