none
Urgente PROBLEMA con Document Print RRS feed

  • Pregunta

  • Hola

    quiero imprimir un ticket en una impresora bixolon 270A, pues el codigo funciona imprime bien, pero al pasar el tiempo deja de imprimir y se tiene que reiniciar windows para poder imprimir otra vez, no encuentro el posible problema les dejo el codigo que utilizo para imprimir, saludos

    Imports System.ComponentModel
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System.Drawing.Printing
    Imports System.IO
    Public Class ticket
        Public LineasDeLaCabeza As ArrayList = New ArrayList()
        Public LineasDeLaSubCabeza As ArrayList = New ArrayList()
        Public Elementos As ArrayList = New ArrayList()
        Public Totales As ArrayList = New ArrayList()
        Public LineasDelPie As ArrayList = New ArrayList()
        Private headerImagep As Image

        Public contador As Integer = 0

        Public CaracteresMaximos As Integer = 1000
        Public CaracteresMaximosDescripcion As Integer = 1000

        Public imageHeight As Integer = 0

        Public MargenIzquierdo As Double = 0
        Public MargenSuperior As Double = 10

        Public NombreDeLaFuente As String = "Calisto MT"
        Public TamanoDeLaFuente As Integer = 9

        Public FuenteImpresa As Font
        Public ColorDeLaFuente As SolidBrush = New SolidBrush(Color.Black)

        Public gfx As Graphics

        Public CadenaPorEscribirEnLinea As String = ""
        Private WithEvents DocumentoAImprimir As New PrintDocument

        Public Sub Ticket()


        End Sub

        Public Property HeaderImage() As Image
            Get
                Return headerImagep
            End Get
            Set(ByVal value As Image)
                'If headerImagep.Width <> value.Width Then

                'End If
                headerImagep = value
            End Set
        End Property



        Public Property MaximoCaracter() As Integer
            Get
                Return CaracteresMaximos
            End Get
            Set(ByVal value As Integer)
                If (value <> CaracteresMaximosDescripcion) Then CaracteresMaximosDescripcion = value
            End Set
        End Property



        Public Property MaximoCaracterDescripcion() As Integer
            Get
                Return CaracteresMaximosDescripcion
            End Get
            Set(ByVal value As Integer)
                If (value <> CaracteresMaximosDescripcion) Then CaracteresMaximosDescripcion = value
            End Set
        End Property



        Public Property TamanoLetra() As Integer
            Get
                Return TamanoDeLaFuente
            End Get
            Set(ByVal value As Integer)
                If (value <> TamanoDeLaFuente) Then TamanoDeLaFuente = value
            End Set
        End Property


        Public Property NombreLetra() As String
            Get
                Return NombreDeLaFuente
            End Get
            Set(ByVal value As String)
                If (value <> NombreDeLaFuente) Then NombreDeLaFuente = value
            End Set
        End Property


        Public Sub AnadirLineaCabeza(ByVal linea As String)
            LineasDeLaCabeza.Add(linea)
        End Sub

        Public Sub AnadirLineaSubcabeza(ByVal linea As String)

            LineasDeLaSubCabeza.Add(linea)
        End Sub

        Public Sub AnadirElemento(ByVal linea As String)
            Elementos.Add(linea)
        End Sub

        Public Sub AnadirTotal(ByVal linea As String)
            Totales.Add(linea)
        End Sub

        Public Sub AnadeLineaAlPie(ByVal linea As String)
            LineasDelPie.Add(linea)
        End Sub

        Private Function AlineaTextoaLaDerecha(ByVal Izquierda As Integer) As String

            Dim espacios As String = ""
            Dim spaces As Integer = MaximoCaracter() - Izquierda
            Dim x As Integer
            For x = 0 To spaces
                espacios += " "
            Next
            Return espacios
        End Function

        Private Function DottedLine() As String

            Dim dotted As String = ""
            Dim x As Integer
            For x = 0 To MaximoCaracter()
                dotted += "="
            Next
            Return dotted
        End Function

        Public Function ImpresoraExistente(ByVal impresora As String) As Boolean

            For Each strPrinter As String In PrinterSettings.InstalledPrinters

                If impresora = strPrinter Then
                    Return True
                End If
            Next strPrinter
            Return False
        End Function

        Public Sub ImprimeTicket(ByVal impresora As String)

            FuenteImpresa = New Font(NombreLetra, TamanoLetra, FontStyle.Regular)
            'Dim pr As New PrintDocument
            DocumentoAImprimir.PrinterSettings.PrinterName = impresora
            'pr.PrinterSettings.printpa()
            ' pr.PrintPage += New
            ' PrintPageEventHandler(pr_PrintPage)
            DocumentoAImprimir.Print()
            DocumentoAImprimir.Dispose() 'con esto descargamos la variable de la memoria, llamamos al recolector de basura, etc.
            DocumentoAImprimir = Nothing
        End Sub

        Private Sub DocumentoAImprimir_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles DocumentoAImprimir.PrintPage
            e.Graphics.PageUnit = GraphicsUnit.Millimeter
            gfx = e.Graphics

            'DrawImage()
            'DrawHeader()
            DibujaLaCabecera()
            'DrawSubHeader()
            DibujaLaSubCabecera()
            'DrawItems()
            DibujaElementos()
            'DrawTotales()
            DibujaTotales()
            DibujarPieDePagina()

            'If (headerImagep.Width <> 0) Then
            ' HeaderImage.Dispose()
            ' HeaderImage.Dispose()
            'End If
        End Sub

        Private Function Renglon() As Double
            Return MargenSuperior + (contador * FuenteImpresa.GetHeight(gfx) + imageHeight)
        End Function

        Private Sub DrawImage()

            If (headerImagep.Width <> 0) Then

                Try

                    gfx.DrawImage(HeaderImage, New Point(CInt(MargenIzquierdo), CInt(Renglon())))
                    Dim height As Double = (HeaderImage.Height / 58) * 15
                    imageHeight = CInt(Math.Round(height) + 3)

                Catch ex As Exception

                End Try


            End If
        End Sub

        Private Sub DibujaLaCabecera()

            For Each Cabecera As String In LineasDeLaCabeza

                If (Cabecera.Length > MaximoCaracter()) Then

                    Dim CaracterActual As Integer = 0
                    Dim LongitudDeCabecera As Integer = Cabecera.Length

                    While (LongitudDeCabecera > MaximoCaracter())

                        CadenaPorEscribirEnLinea = Cabecera.Substring(CaracterActual, MaximoCaracter)
                        gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                        contador += 1
                        CaracterActual += MaximoCaracter()
                        LongitudDeCabecera -= MaximoCaracter()
                    End While
                    CadenaPorEscribirEnLinea = Cabecera
                    gfx.DrawString(CadenaPorEscribirEnLinea.Substring(CaracterActual, CadenaPorEscribirEnLinea.Length - CaracterActual), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1

                Else


                    CadenaPorEscribirEnLinea = Cabecera
                    gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

                    contador += 1
                End If
            Next Cabecera
            DibujaEspacio()
        End Sub

        Private Sub DibujaLaSubCabecera()

            For Each SubCabecera As String In LineasDeLaSubCabeza

                If (SubCabecera.Length > MaximoCaracter()) Then

                    Dim CaracterActual As Integer = 0
                    Dim LongitudSubcabecera As Integer = SubCabecera.Length

                    While (LongitudSubcabecera > MaximoCaracter())

                        CadenaPorEscribirEnLinea = SubCabecera
                        gfx.DrawString(CadenaPorEscribirEnLinea.Substring(CaracterActual, MaximoCaracter), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

                        contador += 1
                        CaracterActual += MaximoCaracter()
                        LongitudSubcabecera -= MaximoCaracter()
                    End While
                    CadenaPorEscribirEnLinea = SubCabecera
                    gfx.DrawString(CadenaPorEscribirEnLinea.Substring(CaracterActual, CadenaPorEscribirEnLinea.Length - CaracterActual), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1

                Else

                    CadenaPorEscribirEnLinea = SubCabecera

                    gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

                    contador += 1

                    CadenaPorEscribirEnLinea = DottedLine()

                    gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

                    contador += 1
                End If
            Next SubCabecera
            DibujaEspacio()
        End Sub

        Private Sub DibujaElementos()
            For Each elemento As String In Elementos
                If (elemento.Length > MaximoCaracter()) Then
                    Dim CaracterActual As Integer = 0
                    Dim LongitudDeElemento As Integer = elemento.Length
                    While (LongitudDeElemento > MaximoCaracter())
                        CadenaPorEscribirEnLinea = elemento.Substring(CaracterActual, MaximoCaracter)
                        gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                        contador += 1
                        CaracterActual += MaximoCaracter()
                        LongitudDeElemento -= MaximoCaracter()
                    End While
                    CadenaPorEscribirEnLinea = elemento
                    gfx.DrawString(CadenaPorEscribirEnLinea.Substring(CaracterActual, CadenaPorEscribirEnLinea.Length - CaracterActual), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1
                Else
                    CadenaPorEscribirEnLinea = elemento
                    gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1
                End If
            Next elemento
            DibujaEspacio()     
        End Sub

        Private Sub DibujaTotales()
            For Each total As String In Totales
                If (total.Length > MaximoCaracter()) Then
                    Dim CaracterActual As Integer = 0
                    Dim LongitudDeTotal As Integer = total.Length
                    While (LongitudDeTotal > MaximoCaracter())
                        CadenaPorEscribirEnLinea = total.Substring(CaracterActual, MaximoCaracter)
                        gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                        contador += 1
                        CaracterActual += MaximoCaracter()
                        LongitudDeTotal -= MaximoCaracter()
                    End While
                    CadenaPorEscribirEnLinea = total
                    CadenaPorEscribirEnLinea = AlineaTextoaLaDerecha(CadenaPorEscribirEnLinea.Length) + CadenaPorEscribirEnLinea
                    gfx.DrawString(CadenaPorEscribirEnLinea.Substring(CaracterActual, CadenaPorEscribirEnLinea.Length - CaracterActual), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1
                Else
                    CadenaPorEscribirEnLinea = total
                    gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1
                End If
            Next total
            MargenIzquierdo = 0
            DibujaEspacio()
            DibujaEspacio()
        End Sub

        Private Sub DibujarPieDePagina()

            For Each PieDePagina As String In LineasDelPie

                If (PieDePagina.Length > MaximoCaracter()) Then

                    Dim currentChar As Integer = 0
                    Dim LongitudPieDePagina As Integer = PieDePagina.Length

                    While (LongitudPieDePagina > MaximoCaracter())

                        CadenaPorEscribirEnLinea = PieDePagina
                        gfx.DrawString(CadenaPorEscribirEnLinea.Substring(currentChar, MaximoCaracter), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

                        contador += 1
                        currentChar += MaximoCaracter()
                        LongitudPieDePagina -= MaximoCaracter()
                    End While
                    CadenaPorEscribirEnLinea = PieDePagina
                    gfx.DrawString(CadenaPorEscribirEnLinea.Substring(currentChar, CadenaPorEscribirEnLinea.Length - currentChar), FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())
                    contador += 1

                Else

                    CadenaPorEscribirEnLinea = PieDePagina
                    gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

                    contador += 1
                End If
            Next PieDePagina
            MargenIzquierdo = 0
            DibujaEspacio()
        End Sub

        Private Sub DibujaEspacio()

            CadenaPorEscribirEnLinea = " "

            gfx.DrawString(CadenaPorEscribirEnLinea, FuenteImpresa, ColorDeLaFuente, MargenIzquierdo, Renglon(), New StringFormat())

            contador += 1

        End Sub

        Public Sub New()

        End Sub


    End Class




    Public Class OrdenarElementos

        Public delimitador() As Char = " "


        Public Sub OrdenarElementos(ByVal delimit As Char)
            Dim delimitador As Char = delimit
        End Sub


        Public Function ObtenerCantidadDeElementos(ByVal orderItem As String) As String

            Dim delimitado() As String = orderItem.Split(delimitador)
            Return delimitado(0)
        End Function

        Public Function ObtenerNombreElemento(ByVal orderItem As String) As String

            Dim delimitado() As String = orderItem.Split(delimitador)
            Return delimitado(1)
        End Function

        Public Function ObtenerPrecioElemento(ByVal orderItem As String) As String

            Dim delimitado() As String = orderItem.Split(delimitador)
            Return delimitado(2)
        End Function

        Public Function GenerarElemento(ByVal cantidad As String, ByVal NombreElemento As String, ByVal Precio As String) As String

            Return cantidad + delimitador(0) + NombreElemento + delimitador(0) + Precio
        End Function
    End Class




    Public Class OrdernarTotal

        Public delimitador() As Char = " "

        Public Sub OrdernarTotal(ByVal delimit As Char)

            Dim delimitador As Char = delimit
        End Sub

        Public Function ObtenerTotalNombre(ByVal totalItem As String) As String

            Dim delimitado() As String = totalItem.Split(delimitador)
            Return delimitado(0)

        End Function
        Public Function ObtenerTotalCantidad(ByVal totalItem As String) As String

            Dim delimitado() As String = totalItem.Split(delimitador)
            Return delimitado(1)
        End Function

        Public Function GenerarTotal(ByVal totalName As String, ByVal price As Double) As String

            GenerarTotal = totalName + delimitador(0) + price
        End Function

    End Class

    lunes, 12 de octubre de 2015 22:43

Respuestas

  • No hay en tu código nada que sea obvio o evidente a simple vista que pueda hacer que la impresora deje de imprimir al cabo de un tiempo. Pueden pasar dos cosas: que sea problema de tu código o que sea problema de los propios drivers de la impresora. Para depurar el problema, se me ocurren algunas pruebas que podrías hacer:

    - La primera es "instrumentar" tu código, salpicándolo de instrucciones que vayan registrando qué partes se ejecutan (por ejemplo, pordrías usar System.Diagnostics.Trace). Cuando la impresora deje de generar documentos, comprueba si la traza indica que tu código sigue todavía ejecutándose. Si es así, esto indicaría que el problema está más bien en los drivers de la impresora que en tu código.

    - Comprueba desde Windows la cola de la impresora, y verifica si cuando tu programa imprime sigue inyectando documentos en la cola, y lo que pasa es que la impresora no los imprime. Esto indicaría también un problema con los drivers de la impresora. A veces este tipo de problema puede resolverse parando el servicio spooler y volviéndolo a iniciar, cosa que es mucho más "liviana" que reiniciar Windows, e incluso podrías hacerlo periódicamente desde tu programa para soslayar el problema.

    - Prueba a seleccionar una impresora distinta (puede ser una impresora virtual si no tienes otra impresora física) e imprimir sobre ella desde el programa. Si con esta funciona y con la orignial no, entonces casi seguro que se trata de un problema con los drivers de la impresora y no con tu programa.

    martes, 13 de octubre de 2015 9:03