0
Good afternoon, I am trying to print a text (ZPL code), but in my code there are ASCII delimiters, and for this reason does not generate correct impression, that is to say missing certain characters. Does anyone know any method to generate printing containing all ASCII characters.
Note: I am trying to print in 2D PDF barcode (147).
It follows as I tried to print below: Attempt 1
Shell("print /D:\\ & caminhoImpressora & "C:\ETIQUETA.TXT", ppWinStyle.Hide)
Attempt 2
Impressao.SendStringToPrinter("caminhoImpressora", "texto")
Imports System
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.IO
Public Class Impressao
<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)> _
Friend Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> ByVal szPrinter As String, ByRef hPrinter As IntPtr, ByVal pd As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="ClosePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartDocPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, <MarshalAs(UnmanagedType.LPStruct)> ByVal di As DOCINFOA) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="WritePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal pBytes As IntPtr, ByVal dwCount As Int32, ByRef dwWritten As Int32) As Boolean
End Function
#Region "Metodos"
Friend Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean
Dim dwError As Integer = 0, dwWritten As Integer = 0
Dim hPrinter = New IntPtr(0)
Dim di = New DOCINFOA()
Dim bSuccess As Boolean = False 'Assume failure unless you specifically succeed.
di.pDocName = "Impressao Automatica"
di.pDataType = "RAW"
'Abre o método OpenPrinter
If OpenPrinter(szPrinterName.Normalize(), hPrinter, IntPtr.Zero) Then
'Incia o documento.
If (StartDocPrinter(hPrinter, 1, di)) Then
'Inicia a página.
If (StartPagePrinter(hPrinter)) Then
'Escreve os bytes na impressora.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)
EndPagePrinter(hPrinter)
End If
EndDocPrinter(hPrinter)
End If
ClosePrinter(hPrinter)
End If
'Caso exista algum erro, retorna o erro.
If bSuccess = False Then
dwError = Marshal.GetLastWin32Error()
End If
Return bSuccess
End Function
Friend Shared Function SendFileToPrinter(ByVal szPrinterName As String, ByVal szFileName As String) As Boolean
'Abre o arquivo
Dim fs = New FileStream(szFileName, FileMode.Open)
'Cria um objeto BinaryReader com o arquivo.
Dim br = New BinaryReader(fs)
'Dim an array of bytes big enough to hold the file's contents.
Dim bytes(fs.Length) As Byte
Dim bSuccess As Boolean = False
'Your unmanaged pointer.
Dim pUnmanagedBytes = 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
Friend Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String) As Boolean
Dim pBytes As IntPtr
Dim dwCount As Integer
'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 Region
What characters are giving trouble? It is likely that you will have to replace all characters whose ASCII code is less than 32, as they are usually not printable, or have special meanings for the printer (e. g. Form Feed, Line Feed, Carriage Return).
– VBobCat
I’m having trouble with Chr(30) "Record Separator" and Chr(4) "End Of Transm.", are the only special characters that are giving problem, Chr(29) "Group Separator" works correctly.
– FeeBenitez
On page 1280 of ZPL Programming Guide it is indicated that these characters are not recommended. I suppose you’ll have to iterate on your byte array to replace them with another character.
– VBobCat
Thank you Vbobcat, I had not attacked myself to the detail of the manual.
– FeeBenitez