Print text in ASCII

Asked

Viewed 150 times

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).

  • 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.

  • 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.

  • Thank you Vbobcat, I had not attacked myself to the detail of the manual.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.