Foros del Web » Programación para mayores de 30 ;) » .NET »

Problemas para imprimir un comprobante de pago en asp .NET

Estas en el tema de Problemas para imprimir un comprobante de pago en asp .NET en el foro de .NET en Foros del Web. Es una aplicacion en asp .NET programado en visual basic y necesito imprimir un ticket de comprobante de pago en una miniprinter Epson TM-T88IV. El ...
  #1 (permalink)  
Antiguo 07/08/2007, 23:38
Avatar de jorgelig  
Fecha de Ingreso: septiembre-2004
Ubicación: Chapis Data Center
Mensajes: 27
Antigüedad: 19 años, 7 meses
Puntos: 0
Problemas para imprimir un comprobante de pago en asp .NET

Es una aplicacion en asp .NET programado en visual basic y necesito imprimir un ticket de comprobante de pago en una miniprinter Epson TM-T88IV.

El comprobante lo hice con un webform que captura la id del pago y trae los datos desde la BD, y un javascript para imprimir; pero en el ticket me sale un margen de 2cm por lado y un espacio en blanco como dw 10cm debajo del comprobante (segun lei; al ahora de imprimir lo toma como si fuera una pagina normal y deja el espacio que falta para terminar la hoja) y ademas no corta el ticket :S

Eh buscado informacion pero la verdad ahora estoy mas perdido que cuando comenze a buscar:

Algunos dicen que con crystal Report se puede, pero tambien lei que es necesario comprar una licencia, porque la que trae el studio no funciona fuera de pruebas.

Tambien por ahi vi una clase hecha en C# pero no eh podido convertirla a visual basic .NET. la saque de aqui: http://www.foromsn.com/index.php?Ver=Mensaje&Id=178209&VerEtiqueta=301

Otra opcion que vi por ahi es convertir el reporte a imagen y luego imprimir la imagen. Pero no se como hacerle, porque los ejemplos que eh visto son para guardarse y/o son para captchas. No eh visto ninguno para convertir todo el webform.


Anteriormente usaban una aplicacion hecha en VB6, de la cual no tengo codigo ni nada, que imprime bien el ticket (sin margenes ni espacios en blanco) y ademas corta el ticket automaticamente. ¿Como podria hacer esto en asp .NET usando Visual Basic?

Pd. Como se daran cuenta soy algo nuevo con aspx, es lo primero serio que hago en aspx XD
  #2 (permalink)  
Antiguo 08/08/2007, 11:24
Avatar de Korku  
Fecha de Ingreso: noviembre-2003
Ubicación: En un lugar oscuro...
Mensajes: 688
Antigüedad: 20 años, 5 meses
Puntos: 5
Re: Problemas para imprimir un comprobante de pago en asp .NET

Cita:
Iniciado por jorgelig Ver Mensaje
Es una aplicacion en asp .NET programado en visual basic y necesito imprimir un ticket de comprobante de pago en una miniprinter Epson TM-T88IV.

El comprobante lo hice con un webform que captura la id del pago y trae los datos desde la BD, y un javascript para imprimir; pero en el ticket me sale un margen de 2cm por lado y un espacio en blanco como dw 10cm debajo del comprobante (segun lei; al ahora de imprimir lo toma como si fuera una pagina normal y deja el espacio que falta para terminar la hoja) y ademas no corta el ticket :S

Eh buscado informacion pero la verdad ahora estoy mas perdido que cuando comenze a buscar:

Algunos dicen que con crystal Report se puede, pero tambien lei que es necesario comprar una licencia, porque la que trae el studio no funciona fuera de pruebas.

Tambien por ahi vi una clase hecha en C# pero no eh podido convertirla a visual basic .NET. la saque de aqui: http://www.foromsn.com/index.php?Ver...erEtiqueta=301

Otra opcion que vi por ahi es convertir el reporte a imagen y luego imprimir la imagen. Pero no se como hacerle, porque los ejemplos que eh visto son para guardarse y/o son para captchas. No eh visto ninguno para convertir todo el webform.


Anteriormente usaban una aplicacion hecha en VB6, de la cual no tengo codigo ni nada, que imprime bien el ticket (sin margenes ni espacios en blanco) y ademas corta el ticket automaticamente. ¿Como podria hacer esto en asp .NET usando Visual Basic?

Pd. Como se daran cuenta soy algo nuevo con aspx, es lo primero serio que hago en aspx XD
Mira si la Epson TM-T88IV es una térmica no tienes problemas:

1 - Si quieres que imprima una imagen, o sea, un logo (tiene que ser monocromo) puedes almacenarlo en la memoria interna mediante un programa proporcionado por el fabricante. Lee el manual de usuario para saber que caracteres hexadecimales para que imprima el logo.

2 - Puedes generar un fichero de texto plano (textos y carácteres ASCII) y copiarlo a la impresora, es decir, que sea como un recurso compartido.

A todo esto, lo tengo hecho para una PDA con VB.NET y funciona sin problemas.

Saludiños
__________________
Carpe diem quam minimum credula postero.


http://www.programador-freelance.es
  #3 (permalink)  
Antiguo 14/08/2007, 15:38
Avatar de jorgelig  
Fecha de Ingreso: septiembre-2004
Ubicación: Chapis Data Center
Mensajes: 27
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Problemas para imprimir un comprobante de pago en asp .NET

Muchas gracias por la ayuda, ya solucione el problema de mandar a imprimir. Ahora tengo el problema que no corta el ticket al terminar de imprimir. Para imprimir uso este metodo:

Código:
public void PrintTicket(string impresora)
        {
            printFont = new Font(fontName, fontSize, FontStyle.Regular);
            PrintDocument pr = new PrintDocument();
            pr.PrinterSettings.PrinterName = impresora;
            pr.PrintPage += new PrintPageEventHandler(pr_PrintPage);
            pr.Print();
        }
Y ya consegui las secuencias de escape, solo que no se como enviarlas a la impresora:
ASCII | Dec. | Hex. | Descripción
ESC i | 105 | 69 | Corte total de papel
ESC m 109 | 6D | Corte parcial de papel
  #4 (permalink)  
Antiguo 14/08/2007, 15:50
Avatar de Korku  
Fecha de Ingreso: noviembre-2003
Ubicación: En un lugar oscuro...
Mensajes: 688
Antigüedad: 20 años, 5 meses
Puntos: 5
Re: Problemas para imprimir un comprobante de pago en asp .NET

Usando la funcíón Chr(numero), en el manual de la impresora tienes una tabla de números hexadecimales, por ejemplo el ESC es 64

Saludos
__________________
Carpe diem quam minimum credula postero.


http://www.programador-freelance.es
  #5 (permalink)  
Antiguo 14/08/2007, 17:05
Avatar de jorgelig  
Fecha de Ingreso: septiembre-2004
Ubicación: Chapis Data Center
Mensajes: 27
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Problemas para imprimir un comprobante de pago en asp .NET

Asi es como lo intente:

tiquete.AddFooterLine(Chr(105))

Pero me imprime una el caracter i
  #6 (permalink)  
Antiguo 14/08/2007, 17:31
Avatar de jorgelig  
Fecha de Ingreso: septiembre-2004
Ubicación: Chapis Data Center
Mensajes: 27
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Problemas para imprimir un comprobante de pago en asp .NET

Estoy usando esta clase http://mig16.cep.la/Ticket.cs
  #7 (permalink)  
Antiguo 14/08/2007, 22:08
 
Fecha de Ingreso: agosto-2006
Ubicación: en lima peru
Mensajes: 184
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: Problemas para imprimir un comprobante de pago en asp .NET

Hombre!! Pero Que Loquerio Con Los Reportes, Usa Crystal Report Y Asunto Solucionado No Busques Otras Cosas, Si Deseas Mas Info
Entra A La Web De Willydev Hay Manuales De Crystal Hasta Por Gusto, Mira Yo Imprimo Codigo De Barras Con Crystal Report Y Mediante La Web Ya Que Es Un Buen Reporteador. Cualquier Cosa Estoy En Linea

Developernetx@hotm..
  #8 (permalink)  
Antiguo 15/08/2007, 17:58
Avatar de jorgelig  
Fecha de Ingreso: septiembre-2004
Ubicación: Chapis Data Center
Mensajes: 27
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Problemas para imprimir un comprobante de pago en asp .NET

Me parece que el crystal report lo dejare como muy ultima opcion, ya inverti mucho tiempo para que me imprima el ticket y la verdad no quiero invertir mas para aprender a usar el crystal report. Lo que necesito es enviarle la secuencia de escape a la impresora pero no se como. Tambien me dijeron que en el VB6 usar el metodo EndDocument; pero no eh encontrado nada parecido en .NET; solo encontre "EndPrint" del componente "PrintDocument" pero solo es un evento que informa que termino la impresion.

la clase que uso es esta(en C#):
Código:
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Collections;

namespace DataBase.Normay.ElArco.Source.DataBase.Venta
{
    public class Ticket
    {
        ArrayList headerLines = new ArrayList();
        ArrayList subHeaderLines = new ArrayList();
        ArrayList items = new ArrayList();
        ArrayList totales = new ArrayList();
        ArrayList footerLines = new ArrayList();
        private Image headerImage = null;


        public void PrintTicket(string impresora)
        {
            printFont = new Font(fontName, fontSize, FontStyle.Regular);
            PrintDocument pr = new PrintDocument();
            pr.PrinterSettings.PrinterName = impresora;
            pr.PrintPage += new PrintPageEventHandler(pr_PrintPage);
            pr.Print();
        }

        private void pr_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.PageUnit = GraphicsUnit.Millimeter;
            gfx = e.Graphics;

            DrawImage();
            DrawHeader();
            DrawSubHeader();
//            DrawItems();
            DrawTotales();
            DrawFooter();

            if (headerImage != null)
            {
                HeaderImage.Dispose();
                headerImage.Dispose();
            }
        }

        private float YPosition()
        {
            return topMargin + (count * printFont.GetHeight(gfx) + imageHeight);
        }

        private void DrawImage()
        {
            if (headerImage != null)
            {
                try
                {
                    gfx.DrawImage(headerImage, new Point((int)leftMargin, (int)YPosition()));
                    double height = ((double)headerImage.Height / 58) * 15;
                    imageHeight = (int)Math.Round(height) + 3;
                }
                catch (Exception)
                {
                }
            }
        }

        private void DrawHeader()
        {
            foreach(string header in headerLines)
            {
                if (header.Length > maxChar)
                {
                    int currentChar = 0;
                    int headerLenght = header.Length;

                    while (headerLenght > maxChar)
                    {
                        line = header.Substring(currentChar, maxChar);
                        gfx.DrawString(line, printFont, myBrush, leftMargin,YPosition(), new StringFormat());

                        count++;
                        currentChar += maxChar;
                        headerLenght -= maxChar;
                    }
                    line = header;
                    gfx.DrawString(line.Substring(currentChar, line.Length - currentChar), printFont, myBrush, leftMargin,YPosition(), new StringFormat());
                    count++;
                }
                else
                {
                    line = header;
                    gfx.DrawString(line, printFont, myBrush, leftMargin, YPosition(), new StringFormat());

                    count++;
                }
            }
            DrawEspacio();
        }   

        private void DrawSubHeader()
        {
            foreach (string subHeader in subHeaderLines)
            {
                if (subHeader.Length > maxChar)
                {
                    int currentChar = 0;
                    int subHeaderLenght = subHeader.Length;

                    while (subHeaderLenght > maxChar)
                    {
                        line = subHeader;
                        gfx.DrawString(line.Substring(currentChar, maxChar), printFont, myBrush, leftMargin,YPosition(), new StringFormat());

                        count++;
                        currentChar += maxChar;
                        subHeaderLenght -= maxChar;
                    }
                    line = subHeader;
                    gfx.DrawString(line.Substring(currentChar, line.Length - currentChar), printFont, myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                }
                else
                {
                    line = subHeader;

                    gfx.DrawString(line, printFont, myBrush, leftMargin,YPosition(), new StringFormat());

                    count++;

                    //line = DottedLine();

                    //gfx.DrawString(line, printFont, myBrush, leftMargin, YPosition(), new StringFormat());

                    //count++;
                }
            }
            DrawEspacio();
        }

        private void DrawFooter()
        {
            foreach (string footer in footerLines)
            {
                if (footer.Length > maxChar)
                {
                    int currentChar = 0;
                    int footerLenght = footer.Length;

                    while (footerLenght > maxChar)
                    {
                        line = footer;
                        gfx.DrawString(line.Substring(currentChar, maxChar), printFont, myBrush, leftMargin, YPosition(), new StringFormat());

                        count++;
                        currentChar += maxChar;
                        footerLenght -= maxChar;
                    }
                    line = footer;
                    gfx.DrawString(line.Substring(currentChar, line.Length - currentChar), printFont, myBrush, leftMargin, YPosition(), new StringFormat());
                    count++;
                }
                else
                {
                    line = footer;
                    gfx.DrawString(line, printFont, myBrush, leftMargin, YPosition(), new StringFormat());

                    count++;
                }
            }
            leftMargin = 0;
            DrawEspacio();
        }

        private void DrawEspacio()
        {
            line = "";

            gfx.DrawString(line, printFont, myBrush, leftMargin, YPosition(), new StringFormat());

            count++;
        }
    }

}
y para usarla utilizo estos metodos (en VB):
Código:
tiquete.AddHeaderLine("      ¡Comprobante de pago!")
        tiquete.AddSubHeaderLine("Cliente: " & lblCliente.Text)
        tiquete.AddFooterLine("     ¡ GRACIAS POR SU PAGO !")
        tiquete.PrintTicket("Pruebas")
El problema es que no se ni como ni donde meter las secuencias de escape correspondientes a las del modelo de mi impresora (tengo un pdf donde detalla el codigo decimal y hexadecimal de cada funcionalidad de la impresora)
.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 00:08.