Imprimir etiquetas con código ZPL desde VB. NET

Ciertas impresoras Zebra pueden imprimir mediante un código nativo denominado ZPL, la ventaja de usar este código frente a Crystal Report es la rapidez en la impresión y la posibilidad de enviar comandos de control a la impresora.
En este ejemplo se imprimirán unas etiquetas de asistencia a un congreso. El operador introducirá mediante mediante una aplicación los datos necesarios e imprimirá una etiqueta que internamente será enviada a la impresora mediante código ZPL.

Corregido 08/03/13 


Software y Material necesario:

Descripción general de la aplicación

La aplicación solicitará unos datos al operador mediante una pantalla y ofrecerá un botón para imprimir la etiqueta.
Internamente la clase de recogida de datos enviará la información a la clase impresión ZPL y esta se encargará de lanzar los códigos necesarios por el puerto LPT a la impresora.

Pasos
Lo primero que se deberá realizar será compartir la impresora Zebra en el equipo donde esta conectada, en nuestro caso el recurso compartido será \\NombreEquipo\ZebraS60.

Para imprimir vamos a usar el puerto LPT2 (puede ser cualquier otro). Desde el equipo que tiene la aplicación tenemos que mapear este puerto mediante el comando:
                                      net use LPT2 \\NombreEquipo\ZebraS60

Los datos que vamos a solicitar en la aplicación son:
         nombre del evento.
         nombre, apellidos y empresa del asistente
         fecha actual
         código, en el ejemplo es un texto manual que servirá de identificador único, en la   
                       etiqueta se imprimirá como un código de barras.

Creamos una clase de Visual Basic con el nombre ImpresionZPL, el código de la misma es el siguiente:

Imports System
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class ImpresionZPL

    Public Const GENERIC_WRITE = &H40000000
    Public Const OPEN_EXISTING = 3
    Public Const FILE_SHARE_WRITE = &H2

    Dim LPTPORT As String
    Dim PuertoImpresion As String = "LPT2"

    Friend WithEvents btnImpresion As System.Windows.Forms.Button
    Friend WithEvents btnSalir As System.Windows.Forms.Button
    Dim hPort As Integer

    Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
    ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, _
    ByVal dwShareMode As Integer, _
     ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, _
    ByVal dwCreationDisposition As Integer, _
    ByVal dwFlagsAndAttributes As Integer, _
    ByVal hTemplateFile As Integer) As Integer

    Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" _
                            (ByVal hObject As Integer) As Integer
    Dim retval As Integer

     Public Structure SECURITY_ATTRIBUTES
        Private nLength As Integer
        Private lpSecurityDescriptor As Integer
        Private bInheritHandle As Integer
    End Structure


    Public Sub Impresion(ByVal Evento As String, ByVal Nombre As String, _
                         ByVal Apellidos As String, ByVal Empresa As String, _
                         ByVal Codigo As String, ByVal Fecha As String)

        Dim SA As SECURITY_ATTRIBUTES
        'outFile es el archivo stream que contien la etiqueta y su formato
        Dim outFile As FileStream, hPortP As IntPtr
        'Imprime por LPT1 en local.
        'Para la impresión por red vía net use.
        'Se ha de crear un bat con: --> net use LPT2 /del 

        ' --> net use LPT2 \\NombrePC\NombreImpresoraCompartida y colocarlo en
        '....\All Users\Menú Inicio\Programas\Inicio 
        'para que cada usr. que inicie tenga 
        LPTPORT = PuertoImpresion
        hPort = CreateFile(LPTPORT, GENERIC_WRITE, FILE_SHARE_WRITE, _
                           SA, OPEN_EXISTING, 0, 0)
        'Convertir Integer a IntPtr 
        hPortP = New IntPtr(hPort)
        'Crear FileStream usando Handle 
        outFile = New FileStream(hPortP, FileAccess.Write, False)

        Dim fileWriter As New StreamWriter(outFile)

        'Sustitución de caracteres. El alfabeto que maneja esta impresora en concreto

        'es solo inglés por eso se sustituyen las tildes, eñes, etc.

        'Esta operación se debe realizar con todos los campos susceptibles a contener 

        'carácteres no aceptados 
        Apellidos = (Apellidos.Replace("á", "a").Replace("é", "e").Replace("í", "i").Replace("ó", "o").Replace("ú", "u").Replace("Á", "A").Replace("É", "E").Replace("Í", "I").Replace("Ó", "O").Replace("Ú", "U").Replace("ñ", "n").Replace("Ñ", "N").Replace("ç", "c").Replace("Ç", "C").Replace("ª", "."))

        'Poner a mayusculas la primera letra
        Empresa = Empresa.ToLower
        Empresa = (Application.CurrentCulture.TextInfo.ToTitleCase(Empresa))
        Nombre = Nombre.ToLower
        Nombre = (Application.CurrentCulture.TextInfo.ToTitleCase(Nombre))
        Apellidos = Apellidos.ToLower
        Apellidos = (Application.CurrentCulture.TextInfo.ToTitleCase(Apellidos))

        '--------------------------INICIO ETIQUETA---------------------------' 
        fileWriter.Write("^XA")
        'Deshabilita el panel de la impresora, para que el usr no pueda acceder
        fileWriter.Write("^MPS")
        'Posicion del eje de cordenadas, en dots
        fileWriter.Write("^LH0,0")
        'FO para el inicio de escritura, eje X,Y
        'AU el formato de la fuente
        'FB establece un espacio de 900 dots y la C para centrar el texto
        fileWriter.Write("^FO1,30^AU^FB900,1,0,C^FD" & Evento & "^FS")

        'AD el formato de la fuente y el 20 para el tamaño de la fuente
        fileWriter.Write("^FO50,90^AD,,20^FD" & Apellidos & "^FS")

        fileWriter.Write("^FO50,130^AD,,20^FD" & Nombre & "^FS")

        fileWriter.Write("^FO520,130^AD,,10^FD" & "Historia Cl. " & Empresa & "^FS")

        'GB escribe una linea horizontal 900 largo, 0 grosor y 2 ancho
        fileWriter.Write("^FO50,165^FR^GB900,0,2^FS")

        fileWriter.Write("^FO520,180^AD^FD" & Fecha & "^FS")

        'B3 escribe el texto en cod. de barras tipo B3 (alfanumerico)

        'el 60 para el tamaño
        fileWriter.Write("^FO200,200^B3,,60^FD" & Codigo & " ^FS")
        '--------------------------PIE DE ETIQUETA---------------------------'
        fileWriter.Write("^FO100,290^AD^FD" & "SUJA Corporation" & "^FS")
        'Finaliza la etiqueta
        fileWriter.Write("^XZ")
        fileWriter.Flush()
        fileWriter.Close()
        outFile.Close()
        retval = CloseHandle(hPort)
    End Sub
End Class

Ahora es necesario crear una interfaz para introducir de forma sencilla los datos.

 

El código es el siguiente

Public Class frmSolicitudInfo

    Private Sub btnImprimir_Click(sender As System.Object, e As System.EventArgs) _
        Handles btnImprimir.Click

        Dim NuevaImpresionZPL As New ImpresionZPL
        NuevaImpresionZPL.Impresion(txtEvento.Text, txtNombre.Text, _
                                    txtApellidos.Text, txtEmpresa.Text, _
                                    txtCodigo.Text, dtpFecha.ToString)
    End Sub

    Private Sub btnSalir_Click_1(sender As System.Object, e As System.EventArgs) Handles btnSalir.Click
        Me.Close()
    End Sub

End Class


             _____________________________________________________________
Problema:

La aplicación fue realizada con MS Visual Studio 2003 y al compilarla con una versión superior muestra la siguiente alerta referente al uso de una biblioteca obsoleta.


Para solucionarlo ver el enlace http://msdn.microsoft.com/es-es/library/ee461502.aspx
Debemos modificar el archivo app.config de nuestra aplicación.




    
      
      
    

No hay comentarios:

Publicar un comentario