none
Como Crear e Imprimir un Ticket (Recibo)

    Question

  •  

    Estoy haciendo un Punto de Venta y necesito saber como puedo crear un ticket y de que forma lo puedo mandar imprimir.

     

    Agradeceria que me digan que controles puedo usar o como lo puedo hacer y tambien quisiera saber si se puede utilizar cualquier impresora..... No se ni por donde empezar.. Gracias.

     

     

     

     

    • Moved by Fran DiazModerator Thursday, May 21, 2009 5:19 PM Reporting ([Loc]From:Lenguaje VB.NET)
    Friday, February 22, 2008 3:29 AM

Answers

  • Si estas haciendo un punto de venta, normalmente usas impresoras de tickets y las recomendables son las termales, te paso la lib para que la pruebes y me dices que tal

    La cuestion de usar CR o similar es el formato de la impresora y papel, aqui una solucion que imprime directo al papel de la imrpesora de tickets que tiene un tamaño especifico

    El ejemplo va incluido y mas o menos es asi

    Code Snippet

    Ticket ticket = new Ticket();

                ticket.AddHeaderLine("ChafiTienda");
                ticket.AddHeaderLine("EXPEDIDO EN:");
                ticket.AddHeaderLine("CALLE CONOCIDA");
                ticket.AddHeaderLine("PUEBLA, PUEBLA");
                ticket.AddHeaderLine("RFC: CSI-020226-MV4");

                ticket.AddSubHeaderLine("Ticket # 1");
                ticket.AddSubHeaderLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString());
               
                ticket.AddItem("Cantidad", "Nombre producto", "Total");

                ticket.AddTotal("SUBTOTAL", "12.00");
                ticket.AddTotal("IVA", "0");
                ticket.AddTotal("TOTAL", "24");
                ticket.AddTotal("", "");
                ticket.AddTotal("RECIBIDO", "0");
                ticket.AddTotal("CAMBIO", "0");
                ticket.AddTotal("", "");

                ticket.AddFooterLine("VUELVA PRONTO");

                ticket.PrintTicket("EPSON TM-T88III Receipt"); //Nombre de la impresora de tickets


    La lib aqui

    Espero te sea de ayuda, colabora con el foro marcandola la respuesta si te sirvio
    Friday, February 22, 2008 6:36 PM
  • Creacion e impresion de ticket de venta.
    Por Romeo Alejandro Romero Sotelo
    romeo_jerez@yahoo.com.mx

    Quiero compartir con ustedes el siguiente codigo en "C Sharp" que diseñe para crear e imprimir un ticket de venta, el codigo consiste en dos clases, la clase CreaTicket tiene varios metodos los cuales se usan para mandar texto con formato definido a la clase RawPrinterHelper la cual envia a impresora.
    La clase RawPrinterHelper lo descargue de una pagina de "msdn", se usa en vez del metodo print del objeto PrintDocument ya que este ultimo no permite enviar caracteres de control a la impresora como corte de papel o apertura de cajon. Los metodos disponibles y sus ejemplos se encuentran comentados en el codigo.

    El diseño esta hecho para usarse en una impresora Epson de matriz de puntos de 40 caracteres por linea, sin embargo se puede usar para otro tipo de impresora solo habria que cambiar los caracteres de control "corte de papel" y "apertura de cajón".

    El siguiente ejemplo es demostrativo y consiste solo en un boton, que al presionar imprime un pequeño ticket.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    // se agrega la siguiente referencia para enviar texto a impresora
    using System.Runtime.InteropServices;


    namespace PruebaImpresionTicket
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                string descripcion = "Aspirina tabletas";
                int cantidad = 2;
                double precio = 45.25;
                double total = 90.5;
                CreaTicket Ticket1 = new CreaTicket();
                Ticket1.AbreCajon();  //abre el cajon
                Ticket1.TextoCentro("Venta mostrador"); // imprime en el centro "Venta mostrador"
                Ticket1.LineasGuion(); // imprime una linea de guiones
                Ticket1.EncabezadoVenta(); // imprime encabezados
                Ticket1.AgregaArticulo(descripcion,cantidad,precio,total); //imprime una linea de descripcion
                Ticket1.LineasTotales(); // imprime linea
                Ticket1.AgregaTotales("Total",total); // imprime linea con total
                Ticket1.CortaTicket(); // corta el ticket
            }
        }
        #region Clase para generar ticket
        // La clase "CreaTicket" tiene varios metodos para imprimir con diferentes formatos (izquierda, derecha, centrado, desripcion precio,etc), a
        // continuacion se muestra el metodo con ejemplo de parametro que acepta, longitud maxima y un ejemplo de como imprimira, esta clase esta
        // basada en una impresora Epson de matriz de puntos con impresion maxima de 40 caracteres por renglon
        // METODO                                      MAX_LONG                        EJEMPLOS
        //--------------------------------------------------------------------------------------------------------------------------
        // TextoIzquierda("Empleado 1")                    40                      Empleado 1      
        // TextoDerecha("Caja 1")                          40                                                        Caja 1
        // TextoCentro("Ticket")                           40                                         Ticket   
        // TextoExtremos("Fecha 6/1/2011","Hora:13:25")     18 y 18                 Fecha 6/1/2011                Hora:13:25
        // EncabezadoVenta()                                n/a                     Articulo        Can    P.Unit    Importe
        // LineasGuion()                                    n/a                     ----------------------------------------
        // AgregaArticulo("Aspirina","2",45.25,90.5)        16,3,10,11              Aspirina          2    $45.25     $90.50
        // LineasTotales()                                  n/a                                                ----------
        // AgregaTotales("Subtotal",235.25)                 25 y 15                Subtotal                         $235.25
        // LineasAsterisco()                                n/a                     ****************************************
        // LineasIgual()                                    n/a                     ========================================
        // CortaTicket()
        // AbreCajon()
        public class CreaTicket
        {
            string ticket = "";
            string parte1, parte2;
            string impresora = "\\\\FARMACIA-PVENTA\\Generic / Text Only"; // nombre exacto de la impresora como esta en el panel de control
            int max, cort;
            public void LineasGuion()
            {
                ticket = "----------------------------------------\n";   // agrega lineas separadoras -
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasAsterisco()
            {
                ticket = "****************************************\n";   // agrega lineas separadoras *
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasIgual()
            {
                ticket = "========================================\n";   // agrega lineas separadoras =
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasTotales()
            {
                ticket = "                             -----------\n"; ;   // agrega lineas de total
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void EncabezadoVenta()
            {
                ticket = "Articulo        Can    P.Unit    Importe\n";   // agrega lineas de  encabezados
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoIzquierda(string par1)                          // agrega texto a la izquierda
            {
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);        // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoDerecha(string par1)
            {
                ticket = "";
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);           // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                max = 40 - par1.Length;                     // obtiene la cantidad de espacios para llegar a 40
                for (int i = 0; i < max; i++)
                {
                    ticket += " ";                          // agrega espacios para alinear a la derecha
                }
                ticket += parte1 + "\n";                    //Agrega el texto
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoCentro(string par1)
            {
                ticket = "";
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);          // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                max = (int)(40 - parte1.Length) / 2;         // saca la cantidad de espacios libres y divide entre dos
                for (int i = 0; i < max; i++)                // **********
                {
                    ticket += " ";                           // Agrega espacios antes del texto a centrar
                }                                            // **********
                ticket += parte1 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoExtremos(string par1, string par2)
            {
                max = par1.Length;
                if (max > 18)                                 // **********
                {
                    cort = max - 18;
                    parte1 = par1.Remove(18, cort);          // si par1 es mayor que 18 lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1;                             // agrega el primer parametro
                max = par2.Length;
                if (max > 18)                                 // **********
                {
                    cort = max - 18;
                    parte2 = par2.Remove(18, cort);          // si par2 es mayor que 18 lo corta
                }
                else { parte2 = par2; }
                max = 40 - (parte1.Length + parte2.Length);
                for (int i = 0; i < max; i++)                 // **********
                {
                    ticket += " ";                            // Agrega espacios para poner par2 al final
                }                                             // **********
                ticket += parte2 + "\n";                     // agrega el segundo parametro al final
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void AgregaTotales(string par1, double total)
            {
                max = par1.Length;
                if (max > 25)                                 // **********
                {
                    cort = max - 25;
                    parte1 = par1.Remove(25, cort);          // si es mayor que 25 lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1;
                parte2 = total.ToString("c");
                max = 40 - (parte1.Length + parte2.Length);
                for (int i = 0; i < max; i++)                // **********
                {
                    ticket += " ";                           // Agrega espacios para poner el valor de moneda al final
                }                                            // **********
                ticket += parte2 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void AgregaArticulo(string par1, int cant, double precio, double total)
            {
                if (cant.ToString().Length <= 3 && precio.ToString("c").Length <= 10 && total.ToString("c").Length <= 11) // valida que cant precio y total esten dentro de rango
                {
                    max = par1.Length;
                    if (max > 16)                                 // **********
                    {
                        cort = max - 16;
                        parte1 = par1.Remove(16, cort);          // corta a 16 la descripcion del articulo
                    }
                    else { parte1 = par1; }                      // **********
                    ticket = parte1;                             // agrega articulo
                    max = (3 - cant.ToString().Length) + (16 - parte1.Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios para poner el valor de cantidad
                    }
                    ticket += cant.ToString();                   // agrega cantidad
                    max = 10 - (precio.ToString("c").Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios
                    }                                            // **********
                    ticket += precio.ToString("c"); // agrega precio
                    max = 11 - (total.ToString().Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios
                    }                                            // **********
                    ticket += total.ToString("c") + "\n"; // agrega precio
                    RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
                }
                else
                {
                    MessageBox.Show("Valores fuera de rango");
                    RawPrinterHelper.SendStringToPrinter(impresora, "Error, valor fuera de rango\n"); // imprime texto
                }
            }
            public void CortaTicket()
            {
                string corte = "\x1B" + "m";                  // caracteres de corte
                string avance = "\x1B" + "d" + "\x09";        // avanza 9 renglones
                RawPrinterHelper.SendStringToPrinter(impresora, avance); // avanza
                RawPrinterHelper.SendStringToPrinter(impresora, corte); // corta
            }
            public void AbreCajon()
            {
                string cajon0 = "\x1B" + "p" + "\x00" + "\x0F" + "\x96";                  // caracteres de apertura cajon 0
                string cajon1 = "\x1B" + "p" + "\x01" + "\x0F" + "\x96";                 // caracteres de apertura cajon 1
                RawPrinterHelper.SendStringToPrinter(impresora, cajon0); // abre cajon0
                //RawPrinterHelper.SendStringToPrinter(impresora, cajon1); // abre cajon1
            }
        }
        #endregion
        #region Clase para enviar a imprsora texto plano
        public class RawPrinterHelper
        {
            // Structure and API declarions:
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public class DOCINFOA
            {
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDocName;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pOutputFile;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDataType;
            }
            [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

            [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool ClosePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

            [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndDocPrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartPagePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndPagePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

            // SendBytesToPrinter()
            // When the function is given a printer name and an unmanaged array
            // of bytes, the function sends those bytes to the print queue.
            // Returns true on success, false on failure.
            public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
            {
                Int32 dwError = 0, dwWritten = 0;
                IntPtr hPrinter = new IntPtr(0);
                DOCINFOA di = new DOCINFOA();
                bool bSuccess = false; // Assume failure unless you specifically succeed.

                di.pDocName = "My C#.NET RAW Document";
                di.pDataType = "RAW";

                // Open the printer.
                if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
                {
                    // Start a document.
                    if (StartDocPrinter(hPrinter, 1, di))
                    {
                        // Start a page.
                        if (StartPagePrinter(hPrinter))
                        {
                            // Write your bytes.
                            bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                            EndPagePrinter(hPrinter);
                        }
                        EndDocPrinter(hPrinter);
                    }
                    ClosePrinter(hPrinter);
                }
                // If you did not succeed, GetLastError may give more information
                // about why not.
                if (bSuccess == false)
                {
                    dwError = Marshal.GetLastWin32Error();
                }
                return bSuccess;
            }

            public static bool SendStringToPrinter(string szPrinterName, string szString)
            {
                IntPtr pBytes;
                Int32 dwCount;
                // 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;
            }
        }
        #endregion

    }

     

    Thursday, January 13, 2011 6:40 AM
  • Hola Oscar,

     

    Puedes crearte un informe con Reporting Services con una medidas(las de tu impresora, o la máquina de tickets), mandarle una fuente de datos e imprimirlos.

    Aquí te dejo unos cuantos enlaces sobre como funciona Reporting Services para que te hagas una idea:

    http://geeks.ms/blogs/fdiaz/archive/2007/12/19/reporting-services-in-visual-studio-2005-i-iii.aspx

    http://geeks.ms/blogs/fdiaz/archive/2008/01/02/reporting-services-in-visual-studio-2005-ii-iii.aspx

    http://geeks.ms/blogs/fdiaz/archive/2008/01/14/reporting-services-in-visual-studio-iii-iii.aspx

    Pequeña introducción:

    http://geeks.ms/blogs/fdiaz/archive/2006/08/29/Presentando-a-Reporting-Services.aspx

    Más enlaces:

    http://geeks.ms/blogs/fdiaz/archive/tags/Reporting+Services/default.aspx

     

    Espero que te sea de utilidad .

     

    Un Saludo

     

    Friday, February 22, 2008 7:47 AM

All replies

  • Hola Oscar,

     

    Puedes crearte un informe con Reporting Services con una medidas(las de tu impresora, o la máquina de tickets), mandarle una fuente de datos e imprimirlos.

    Aquí te dejo unos cuantos enlaces sobre como funciona Reporting Services para que te hagas una idea:

    http://geeks.ms/blogs/fdiaz/archive/2007/12/19/reporting-services-in-visual-studio-2005-i-iii.aspx

    http://geeks.ms/blogs/fdiaz/archive/2008/01/02/reporting-services-in-visual-studio-2005-ii-iii.aspx

    http://geeks.ms/blogs/fdiaz/archive/2008/01/14/reporting-services-in-visual-studio-iii-iii.aspx

    Pequeña introducción:

    http://geeks.ms/blogs/fdiaz/archive/2006/08/29/Presentando-a-Reporting-Services.aspx

    Más enlaces:

    http://geeks.ms/blogs/fdiaz/archive/tags/Reporting+Services/default.aspx

     

    Espero que te sea de utilidad .

     

    Un Saludo

     

    Friday, February 22, 2008 7:47 AM
  • Si estas haciendo un punto de venta, normalmente usas impresoras de tickets y las recomendables son las termales, te paso la lib para que la pruebes y me dices que tal

    La cuestion de usar CR o similar es el formato de la impresora y papel, aqui una solucion que imprime directo al papel de la imrpesora de tickets que tiene un tamaño especifico

    El ejemplo va incluido y mas o menos es asi

    Code Snippet

    Ticket ticket = new Ticket();

                ticket.AddHeaderLine("ChafiTienda");
                ticket.AddHeaderLine("EXPEDIDO EN:");
                ticket.AddHeaderLine("CALLE CONOCIDA");
                ticket.AddHeaderLine("PUEBLA, PUEBLA");
                ticket.AddHeaderLine("RFC: CSI-020226-MV4");

                ticket.AddSubHeaderLine("Ticket # 1");
                ticket.AddSubHeaderLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString());
               
                ticket.AddItem("Cantidad", "Nombre producto", "Total");

                ticket.AddTotal("SUBTOTAL", "12.00");
                ticket.AddTotal("IVA", "0");
                ticket.AddTotal("TOTAL", "24");
                ticket.AddTotal("", "");
                ticket.AddTotal("RECIBIDO", "0");
                ticket.AddTotal("CAMBIO", "0");
                ticket.AddTotal("", "");

                ticket.AddFooterLine("VUELVA PRONTO");

                ticket.PrintTicket("EPSON TM-T88III Receipt"); //Nombre de la impresora de tickets


    La lib aqui

    Espero te sea de ayuda, colabora con el foro marcandola la respuesta si te sirvio
    Friday, February 22, 2008 6:36 PM
  • Buenos dias.

    Me gustaría saber si la librería que ofreces, compañero HardBit, puedo usarla con VB 2008 Express Edition. En caso
    afirmativo, ¿como debería hacerlo?.

    Disculpa mi ignorancia, pero hace mucho que no toco código, y me he tirado a la piscina con el 2008.


    Gracias anticipadas.
    Friday, January 09, 2009 9:17 AM
  • hola hardbit,

     

    yo he utilizado esa clase en mi proyecto, pero tengo varios problemas

     

    1.- Cuando mando imprimir, no imprime o lo hace en la pantalla (si, si, como lo lees, imprime sobre el escritorio y no en la impresora) a que se puede deber esto?

     

    2.- como hago para abrir el cajon de monedas

     

    3.- Como hago para cortar el ticket?

     

    muchas gracias de antemano.

     

    un saludo.

    Saturday, January 10, 2009 12:11 AM
  • Por supuesto, puedes usarla en VB.

    ¿Como usarla? De la misma manera en la que puse el ejemplo en C# pero usando codigo de VB
    Friday, January 23, 2009 5:47 AM
  • Mmm en el caso de la impresion, verifica que el nombre de la impresor sea el corecto, y exactamente igual que en el adminitrador de impresoras.
    En cuando a como abres el cajon de dinero, eso tienes que checarlo dependiendo del tipo de cajon, ya que varian y muchos tienen diferentes codigos para abrirlos, algunos traen algun .bat o .exe para abrir el cajon.
    De igual manera pasa para cortar el ticket, checa la especificacion de tu terminal de impresion, ahi vendra el codigo que tienes que pasar para cortarlo



    Recuerden si les fue de ayuda algun comentario, no olviden marcarlo para referencias de otros usuarios
    Friday, January 23, 2009 5:50 AM
  •  HardBit Escribió:
    Por supuesto, puedes usarla en VB.

    ¿Como usarla? De la misma manera en la que puse el ejemplo en C# pero usando codigo de VB


    Ok!, muchísimas gracias!
    Friday, January 23, 2009 8:40 AM
  • Hola,

    Acabo de recibir una impresora EPSON TM-T88II, quiero imprimir desde Word o Excel.

    Pero no imprime nada.

    El cable de la impresora al PC es de serie, pero yo no tengo Puerto serie en el portatil, he comprado un adaptador USB-Serie, pero no la hago funcionar ¿Será por esto?

    Por favor, os ruego una ayudita........

    Gracias de antemano,
    Monday, April 13, 2009 5:43 PM
  • Tuesday, May 26, 2009 8:46 AM
  • Que tal HardBit vi la libreria y se me hace muy interesante la duda que tengo es como poderle hacer para mandar el ticket a la impresora directamente sin necesidad de que este configurada en el administrador de impresoras, es decir mandar los datos del ticket directo por el puerto serial a la impresora.
    Wednesday, November 10, 2010 5:52 AM
  • descargue el archivo y no me funciona yo tengo vb .net 2008, me lo podrías enviar a mi correo. muchas gracias
    Friday, November 12, 2010 5:12 PM
  • Hola

    Lei este foro y se me hizo interesante lo de hacer los tickets, yo también quiero hacer uno, pero la verdad no logre entender mucho, espero me puedas ayudar, también estoy trabajando en Visual 2008.

    Hasta luego.

    Friday, December 10, 2010 6:16 PM
  • Quisiera saber si la libreria es compatible con windows ce 5.0, ya que al intentar utilizarla me envia un error de emsamblado.

     

    Gracias,

     

    Claudio.

    Thursday, December 16, 2010 9:14 PM
  • Tambien estoi utilizando Windows ce 5.0 i me sale el sgte error al ejecutar la ultima linea:

    "Could not load type 'System.Diagnostics.BooleanSwitch' from assembly 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC'."

     

    quiero imprimir en una POCKET PIDION BIP-100 con impresora integrada, pero ni idea como realizarlo...

    Ayuda...

     

    Gracias! :)

    Friday, January 07, 2011 5:30 PM
  • Creacion e impresion de ticket de venta.
    Por Romeo Alejandro Romero Sotelo
    romeo_jerez@yahoo.com.mx

    Quiero compartir con ustedes el siguiente codigo en "C Sharp" que diseñe para crear e imprimir un ticket de venta, el codigo consiste en dos clases, la clase CreaTicket tiene varios metodos los cuales se usan para mandar texto con formato definido a la clase RawPrinterHelper la cual envia a impresora.
    La clase RawPrinterHelper lo descargue de una pagina de "msdn", se usa en vez del metodo print del objeto PrintDocument ya que este ultimo no permite enviar caracteres de control a la impresora como corte de papel o apertura de cajon. Los metodos disponibles y sus ejemplos se encuentran comentados en el codigo.

    El diseño esta hecho para usarse en una impresora Epson de matriz de puntos de 40 caracteres por linea, sin embargo se puede usar para otro tipo de impresora solo habria que cambiar los caracteres de control "corte de papel" y "apertura de cajón".

    El siguiente ejemplo es demostrativo y consiste solo en un boton, que al presionar imprime un pequeño ticket.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    // se agrega la siguiente referencia para enviar texto a impresora
    using System.Runtime.InteropServices;


    namespace PruebaImpresionTicket
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                string descripcion = "Aspirina tabletas";
                int cantidad = 2;
                double precio = 45.25;
                double total = 90.5;
                CreaTicket Ticket1 = new CreaTicket();
                Ticket1.AbreCajon();  //abre el cajon
                Ticket1.TextoCentro("Venta mostrador"); // imprime en el centro "Venta mostrador"
                Ticket1.LineasGuion(); // imprime una linea de guiones
                Ticket1.EncabezadoVenta(); // imprime encabezados
                Ticket1.AgregaArticulo(descripcion,cantidad,precio,total); //imprime una linea de descripcion
                Ticket1.LineasTotales(); // imprime linea
                Ticket1.AgregaTotales("Total",total); // imprime linea con total
                Ticket1.CortaTicket(); // corta el ticket
            }
        }
        #region Clase para generar ticket
        // La clase "CreaTicket" tiene varios metodos para imprimir con diferentes formatos (izquierda, derecha, centrado, desripcion precio,etc), a
        // continuacion se muestra el metodo con ejemplo de parametro que acepta, longitud maxima y un ejemplo de como imprimira, esta clase esta
        // basada en una impresora Epson de matriz de puntos con impresion maxima de 40 caracteres por renglon
        // METODO                                      MAX_LONG                        EJEMPLOS
        //--------------------------------------------------------------------------------------------------------------------------
        // TextoIzquierda("Empleado 1")                    40                      Empleado 1      
        // TextoDerecha("Caja 1")                          40                                                        Caja 1
        // TextoCentro("Ticket")                           40                                         Ticket   
        // TextoExtremos("Fecha 6/1/2011","Hora:13:25")     18 y 18                 Fecha 6/1/2011                Hora:13:25
        // EncabezadoVenta()                                n/a                     Articulo        Can    P.Unit    Importe
        // LineasGuion()                                    n/a                     ----------------------------------------
        // AgregaArticulo("Aspirina","2",45.25,90.5)        16,3,10,11              Aspirina          2    $45.25     $90.50
        // LineasTotales()                                  n/a                                                ----------
        // AgregaTotales("Subtotal",235.25)                 25 y 15                Subtotal                         $235.25
        // LineasAsterisco()                                n/a                     ****************************************
        // LineasIgual()                                    n/a                     ========================================
        // CortaTicket()
        // AbreCajon()
        public class CreaTicket
        {
            string ticket = "";
            string parte1, parte2;
            string impresora = "\\\\FARMACIA-PVENTA\\Generic / Text Only"; // nombre exacto de la impresora como esta en el panel de control
            int max, cort;
            public void LineasGuion()
            {
                ticket = "----------------------------------------\n";   // agrega lineas separadoras -
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasAsterisco()
            {
                ticket = "****************************************\n";   // agrega lineas separadoras *
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasIgual()
            {
                ticket = "========================================\n";   // agrega lineas separadoras =
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasTotales()
            {
                ticket = "                             -----------\n"; ;   // agrega lineas de total
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void EncabezadoVenta()
            {
                ticket = "Articulo        Can    P.Unit    Importe\n";   // agrega lineas de  encabezados
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoIzquierda(string par1)                          // agrega texto a la izquierda
            {
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);        // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoDerecha(string par1)
            {
                ticket = "";
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);           // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                max = 40 - par1.Length;                     // obtiene la cantidad de espacios para llegar a 40
                for (int i = 0; i < max; i++)
                {
                    ticket += " ";                          // agrega espacios para alinear a la derecha
                }
                ticket += parte1 + "\n";                    //Agrega el texto
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoCentro(string par1)
            {
                ticket = "";
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);          // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                max = (int)(40 - parte1.Length) / 2;         // saca la cantidad de espacios libres y divide entre dos
                for (int i = 0; i < max; i++)                // **********
                {
                    ticket += " ";                           // Agrega espacios antes del texto a centrar
                }                                            // **********
                ticket += parte1 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoExtremos(string par1, string par2)
            {
                max = par1.Length;
                if (max > 18)                                 // **********
                {
                    cort = max - 18;
                    parte1 = par1.Remove(18, cort);          // si par1 es mayor que 18 lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1;                             // agrega el primer parametro
                max = par2.Length;
                if (max > 18)                                 // **********
                {
                    cort = max - 18;
                    parte2 = par2.Remove(18, cort);          // si par2 es mayor que 18 lo corta
                }
                else { parte2 = par2; }
                max = 40 - (parte1.Length + parte2.Length);
                for (int i = 0; i < max; i++)                 // **********
                {
                    ticket += " ";                            // Agrega espacios para poner par2 al final
                }                                             // **********
                ticket += parte2 + "\n";                     // agrega el segundo parametro al final
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void AgregaTotales(string par1, double total)
            {
                max = par1.Length;
                if (max > 25)                                 // **********
                {
                    cort = max - 25;
                    parte1 = par1.Remove(25, cort);          // si es mayor que 25 lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1;
                parte2 = total.ToString("c");
                max = 40 - (parte1.Length + parte2.Length);
                for (int i = 0; i < max; i++)                // **********
                {
                    ticket += " ";                           // Agrega espacios para poner el valor de moneda al final
                }                                            // **********
                ticket += parte2 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void AgregaArticulo(string par1, int cant, double precio, double total)
            {
                if (cant.ToString().Length <= 3 && precio.ToString("c").Length <= 10 && total.ToString("c").Length <= 11) // valida que cant precio y total esten dentro de rango
                {
                    max = par1.Length;
                    if (max > 16)                                 // **********
                    {
                        cort = max - 16;
                        parte1 = par1.Remove(16, cort);          // corta a 16 la descripcion del articulo
                    }
                    else { parte1 = par1; }                      // **********
                    ticket = parte1;                             // agrega articulo
                    max = (3 - cant.ToString().Length) + (16 - parte1.Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios para poner el valor de cantidad
                    }
                    ticket += cant.ToString();                   // agrega cantidad
                    max = 10 - (precio.ToString("c").Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios
                    }                                            // **********
                    ticket += precio.ToString("c"); // agrega precio
                    max = 11 - (total.ToString().Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios
                    }                                            // **********
                    ticket += total.ToString("c") + "\n"; // agrega precio
                    RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
                }
                else
                {
                    MessageBox.Show("Valores fuera de rango");
                    RawPrinterHelper.SendStringToPrinter(impresora, "Error, valor fuera de rango\n"); // imprime texto
                }
            }
            public void CortaTicket()
            {
                string corte = "\x1B" + "m";                  // caracteres de corte
                string avance = "\x1B" + "d" + "\x09";        // avanza 9 renglones
                RawPrinterHelper.SendStringToPrinter(impresora, avance); // avanza
                RawPrinterHelper.SendStringToPrinter(impresora, corte); // corta
            }
            public void AbreCajon()
            {
                string cajon0 = "\x1B" + "p" + "\x00" + "\x0F" + "\x96";                  // caracteres de apertura cajon 0
                string cajon1 = "\x1B" + "p" + "\x01" + "\x0F" + "\x96";                 // caracteres de apertura cajon 1
                RawPrinterHelper.SendStringToPrinter(impresora, cajon0); // abre cajon0
                //RawPrinterHelper.SendStringToPrinter(impresora, cajon1); // abre cajon1
            }
        }
        #endregion
        #region Clase para enviar a imprsora texto plano
        public class RawPrinterHelper
        {
            // Structure and API declarions:
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public class DOCINFOA
            {
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDocName;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pOutputFile;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDataType;
            }
            [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

            [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool ClosePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

            [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndDocPrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartPagePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndPagePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

            // SendBytesToPrinter()
            // When the function is given a printer name and an unmanaged array
            // of bytes, the function sends those bytes to the print queue.
            // Returns true on success, false on failure.
            public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
            {
                Int32 dwError = 0, dwWritten = 0;
                IntPtr hPrinter = new IntPtr(0);
                DOCINFOA di = new DOCINFOA();
                bool bSuccess = false; // Assume failure unless you specifically succeed.

                di.pDocName = "My C#.NET RAW Document";
                di.pDataType = "RAW";

                // Open the printer.
                if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
                {
                    // Start a document.
                    if (StartDocPrinter(hPrinter, 1, di))
                    {
                        // Start a page.
                        if (StartPagePrinter(hPrinter))
                        {
                            // Write your bytes.
                            bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                            EndPagePrinter(hPrinter);
                        }
                        EndDocPrinter(hPrinter);
                    }
                    ClosePrinter(hPrinter);
                }
                // If you did not succeed, GetLastError may give more information
                // about why not.
                if (bSuccess == false)
                {
                    dwError = Marshal.GetLastWin32Error();
                }
                return bSuccess;
            }

            public static bool SendStringToPrinter(string szPrinterName, string szString)
            {
                IntPtr pBytes;
                Int32 dwCount;
                // 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;
            }
        }
        #endregion

    }

     

    Thursday, January 13, 2011 6:40 AM
  • Hola Romeo Alejandro Romero Sotelo...

    muy bueno tu codigo... me sirvio de mucho, ahora tengo una pregunta como podría imprimir pero no indicando el nombre de la impresora, sino el puerto Ej: lpt1.

    muchas gracias

    Wednesday, March 09, 2011 10:11 PM
  • disculpa pero tengo una duda en que parte cambio el tamaño de letras por ejemplo. es que tengo problemas con el margen derecho
    Tuesday, October 11, 2011 2:35 PM
  • buena tarde Muchachos

    muchas gracias por la librería

    Una pregunta 

    yo implemente la librería en vb2008, pero tengo solo 1 detalle.

    resulta que luego de imprimir el ticket, la impresora sigue sacando el papel, como hago?

    realmente no es una impresora de ticket, es una impresora matiz de punto de 80 columnas normales.

    que puedo hacer, ayúdenme por favor 

    Sunday, July 22, 2012 3:19 PM
  • Hola HardBit primero que todo agradecerte por la librería. esta muy buena... pero tengo algunas preguntas

    habrá alguna forma de editar y de saber cuando la librería agrega las lineas separadoras? 

    ================================

     se puede cambiar el signo igual por otro signo, por ejemplo un asterisco. *********

    como enviamos a la impresora el caracter de corte de impresion?

    desde ya muchas gracias de nuevo.

    saludos.

    Monday, December 03, 2012 9:51 PM
  • Hola HardBit primero que todo agradecerte por la librería. esta muy buena... pero tengo algunas preguntas

    habrá alguna forma de editar y de saber cuando la librería agrega las lineas separadoras? 

    ================================

     se puede cambiar el signo igual por otro signo, por ejemplo un asterisco. *********

    como enviamos a la impresora el caracter de corte de impresion?

    desde ya muchas gracias de nuevo.

    saludos.

    Monday, December 03, 2012 9:52 PM
  • Hola Harbit, el codigo que pusiste funciona correctamente con mi impresora, pero quisiera imprimir desde un datagridview, como seria el codigo.

    Donde modifico las cabeceras de detalle CANT, DESCRIPCION, IMPORTE que no esta en el cogido????

    Gracias, espero tu ayuda.

    Thursday, January 17, 2013 5:49 PM
  • Romeo Alejandro ,  el codigo funciona a la perfeccion solo una Pregunta :

    como puedo manipular el tamaño de la fuente que estoy mandando a imprimir, por ejemplo si quiero que  las letras del encbezado me aparescan en un tamaño mas grade que el resto del texto..

    espero y puedan ayudarme 

    Gracias


    Jose Luis

    Monday, April 29, 2013 10:42 PM
  • Hola, Esta muy buena la libreria: LibPrintTicket, pero tengo dos problemitas, el mayor es que no quiero que me aparescan las lineas     CANTIDAD          DESCRIPCION                       IMPORTE

                                                                =======================================

    y no se como sacarlas, y el segundo menor es como definir que algunas palabras sean en negrita y otras no. Con el comanto ticket.FontName = "Arial Black" pongo en arial negrita pero se me pone todo el texto.

    Bueno muchas gracias de antemano, Espero tu respuesta.
    Wednesday, May 22, 2013 4:24 AM
  • Buenas!

    Estoy desarrollando un programa de facturación en Excel utilizando VB. Quisiera saber si exista la posibilidad de imprimir un tiket fiscal desde excel. y como hacer.

    Muchas gracias


    Wednesday, July 03, 2013 7:52 AM
  • HOLA PAISANO SUPE QUE ERAS DE PUEBLA POR TU EJEMPLO, UNA PREGUNTA TENGO UNA EPSON DE MATRIZ COMPARTIDA EN RED ME SERVIRA? Y SEGUNDA COMO CHECO EL TAMAÑO DEL TICKET LO AJUSTA POR DEFAULT
    Tuesday, August 06, 2013 5:00 PM
  • Hola, esta buenísima esta opción, yo he estado utilizando la que muestran mas arriba, Ticket, pero hay algo que no me gusta jaja todo lo que se imprima se alinea a la izquierda, para lo que son títulos no se ve muy bien. En esta opción que muestras aparentemente esto es lo que buscaba

    // TextoIzquierda("Empleado 1")                    40                      Empleado 1      
        // TextoDerecha("Caja 1")                          40                                                        Caja 1
        // TextoCentro("Ticket")                           40                                         Ticket   
        // TextoExtremos("Fecha 6/1/2011","Hora:13:25")     18 y 18                 Fecha 6/1/2011                Hora:13:25


     Tenes alguna pagina en la que pueda descargar la o las librerias por fa, o si me la pudieras pasar vos al correo techy05.92@gmail.com, muchas gracias :D

    Thursday, September 12, 2013 6:45 PM
  • Hola HardBit:

    primero que todo, muchas gracias por la librería, me funciona muy bien, la consulta que quería hacerte es de qué manera puedo imprimir un código de barras que se guarda en un control image en tu librería, te agradecería la respuesta por favor, muchas gracias de antemano.

    saludos.

    Monday, September 30, 2013 12:50 PM
  • Que onda mi buen tu código esta bien pero el problema es que cuando lo imprimes el encabezado se imprime en una sola line me refiero todo amontonado y bueno no tiene el método para corta el ticket ¡¡
    Monday, December 23, 2013 5:19 AM
  • HardBit, 

    Acabo de usar la librería y quedo muy bien,  muchas gracias, pero siempre el pero jejejeje podrias pasarme el codigo de la libreria para poder cambiar el titulo del detalle como por ejemplo cantidad, medicina, obs asi como el ancho de los item por favor te lo agradezco


    • Edited by Magno Marcelo Saturday, January 25, 2014 3:20 PM Mala escritura
    Saturday, January 25, 2014 2:29 PM
  • Hola HardBit, 

    Acabo de probar tu codigo y esta excelente!!, solo una consulta como le puedo cambiar la linea CANT DESCRIPCION IMPORTE o solo IMPORTE??

    Saturday, February 22, 2014 2:29 AM
  • Creacion e impresion de ticket de venta.
    Por Romeo Alejandro Romero Sotelo
    romeo_jerez@yahoo.com.mx

    Quiero compartir con ustedes el siguiente codigo en "C Sharp" que diseñe para crear e imprimir un ticket de venta, el codigo consiste en dos clases, la clase CreaTicket tiene varios metodos los cuales se usan para mandar texto con formato definido a la clase RawPrinterHelper la cual envia a impresora.
    La clase RawPrinterHelper lo descargue de una pagina de "msdn", se usa en vez del metodo print del objeto PrintDocument ya que este ultimo no permite enviar caracteres de control a la impresora como corte de papel o apertura de cajon. Los metodos disponibles y sus ejemplos se encuentran comentados en el codigo.

    El diseño esta hecho para usarse en una impresora Epson de matriz de puntos de 40 caracteres por linea, sin embargo se puede usar para otro tipo de impresora solo habria que cambiar los caracteres de control "corte de papel" y "apertura de cajón".

    El siguiente ejemplo es demostrativo y consiste solo en un boton, que al presionar imprime un pequeño ticket.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    // se agrega la siguiente referencia para enviar texto a impresora
    using System.Runtime.InteropServices;


    namespace PruebaImpresionTicket
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                string descripcion = "Aspirina tabletas";
                int cantidad = 2;
                double precio = 45.25;
                double total = 90.5;
                CreaTicket Ticket1 = new CreaTicket();
                Ticket1.AbreCajon();  //abre el cajon
                Ticket1.TextoCentro("Venta mostrador"); // imprime en el centro "Venta mostrador"
                Ticket1.LineasGuion(); // imprime una linea de guiones
                Ticket1.EncabezadoVenta(); // imprime encabezados
                Ticket1.AgregaArticulo(descripcion,cantidad,precio,total); //imprime una linea de descripcion
                Ticket1.LineasTotales(); // imprime linea
                Ticket1.AgregaTotales("Total",total); // imprime linea con total
                Ticket1.CortaTicket(); // corta el ticket
            }
        }
        #region Clase para generar ticket
        // La clase "CreaTicket" tiene varios metodos para imprimir con diferentes formatos (izquierda, derecha, centrado, desripcion precio,etc), a
        // continuacion se muestra el metodo con ejemplo de parametro que acepta, longitud maxima y un ejemplo de como imprimira, esta clase esta
        // basada en una impresora Epson de matriz de puntos con impresion maxima de 40 caracteres por renglon
        // METODO                                      MAX_LONG                        EJEMPLOS
        //--------------------------------------------------------------------------------------------------------------------------
        // TextoIzquierda("Empleado 1")                    40                      Empleado 1      
        // TextoDerecha("Caja 1")                          40                                                        Caja 1
        // TextoCentro("Ticket")                           40                                         Ticket   
        // TextoExtremos("Fecha 6/1/2011","Hora:13:25")     18 y 18                 Fecha 6/1/2011                Hora:13:25
        // EncabezadoVenta()                                n/a                     Articulo        Can    P.Unit    Importe
        // LineasGuion()                                    n/a                     ----------------------------------------
        // AgregaArticulo("Aspirina","2",45.25,90.5)        16,3,10,11              Aspirina          2    $45.25     $90.50
        // LineasTotales()                                  n/a                                                ----------
        // AgregaTotales("Subtotal",235.25)                 25 y 15                Subtotal                         $235.25
        // LineasAsterisco()                                n/a                     ****************************************
        // LineasIgual()                                    n/a                     ========================================
        // CortaTicket()
        // AbreCajon()
        public class CreaTicket
        {
            string ticket = "";
            string parte1, parte2;
            string impresora = "\\\\FARMACIA-PVENTA\\Generic / Text Only"; // nombre exacto de la impresora como esta en el panel de control
            int max, cort;
            public void LineasGuion()
            {
                ticket = "----------------------------------------\n";   // agrega lineas separadoras -
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasAsterisco()
            {
                ticket = "****************************************\n";   // agrega lineas separadoras *
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasIgual()
            {
                ticket = "========================================\n";   // agrega lineas separadoras =
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void LineasTotales()
            {
                ticket = "                             -----------\n"; ;   // agrega lineas de total
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime linea
            }
            public void EncabezadoVenta()
            {
                ticket = "Articulo        Can    P.Unit    Importe\n";   // agrega lineas de  encabezados
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoIzquierda(string par1)                          // agrega texto a la izquierda
            {
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);        // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoDerecha(string par1)
            {
                ticket = "";
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);           // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                max = 40 - par1.Length;                     // obtiene la cantidad de espacios para llegar a 40
                for (int i = 0; i < max; i++)
                {
                    ticket += " ";                          // agrega espacios para alinear a la derecha
                }
                ticket += parte1 + "\n";                    //Agrega el texto
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoCentro(string par1)
            {
                ticket = "";
                max = par1.Length;
                if (max > 40)                                 // **********
                {
                    cort = max - 40;
                    parte1 = par1.Remove(40, cort);          // si es mayor que 40 caracteres, lo corta
                }
                else { parte1 = par1; }                      // **********
                max = (int)(40 - parte1.Length) / 2;         // saca la cantidad de espacios libres y divide entre dos
                for (int i = 0; i < max; i++)                // **********
                {
                    ticket += " ";                           // Agrega espacios antes del texto a centrar
                }                                            // **********
                ticket += parte1 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void TextoExtremos(string par1, string par2)
            {
                max = par1.Length;
                if (max > 18)                                 // **********
                {
                    cort = max - 18;
                    parte1 = par1.Remove(18, cort);          // si par1 es mayor que 18 lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1;                             // agrega el primer parametro
                max = par2.Length;
                if (max > 18)                                 // **********
                {
                    cort = max - 18;
                    parte2 = par2.Remove(18, cort);          // si par2 es mayor que 18 lo corta
                }
                else { parte2 = par2; }
                max = 40 - (parte1.Length + parte2.Length);
                for (int i = 0; i < max; i++)                 // **********
                {
                    ticket += " ";                            // Agrega espacios para poner par2 al final
                }                                             // **********
                ticket += parte2 + "\n";                     // agrega el segundo parametro al final
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void AgregaTotales(string par1, double total)
            {
                max = par1.Length;
                if (max > 25)                                 // **********
                {
                    cort = max - 25;
                    parte1 = par1.Remove(25, cort);          // si es mayor que 25 lo corta
                }
                else { parte1 = par1; }                      // **********
                ticket = parte1;
                parte2 = total.ToString("c");
                max = 40 - (parte1.Length + parte2.Length);
                for (int i = 0; i < max; i++)                // **********
                {
                    ticket += " ";                           // Agrega espacios para poner el valor de moneda al final
                }                                            // **********
                ticket += parte2 + "\n";
                RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
            }
            public void AgregaArticulo(string par1, int cant, double precio, double total)
            {
                if (cant.ToString().Length <= 3 && precio.ToString("c").Length <= 10 && total.ToString("c").Length <= 11) // valida que cant precio y total esten dentro de rango
                {
                    max = par1.Length;
                    if (max > 16)                                 // **********
                    {
                        cort = max - 16;
                        parte1 = par1.Remove(16, cort);          // corta a 16 la descripcion del articulo
                    }
                    else { parte1 = par1; }                      // **********
                    ticket = parte1;                             // agrega articulo
                    max = (3 - cant.ToString().Length) + (16 - parte1.Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios para poner el valor de cantidad
                    }
                    ticket += cant.ToString();                   // agrega cantidad
                    max = 10 - (precio.ToString("c").Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios
                    }                                            // **********
                    ticket += precio.ToString("c"); // agrega precio
                    max = 11 - (total.ToString().Length);
                    for (int i = 0; i < max; i++)                // **********
                    {
                        ticket += " ";                           // Agrega espacios
                    }                                            // **********
                    ticket += total.ToString("c") + "\n"; // agrega precio
                    RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto
                }
                else
                {
                    MessageBox.Show("Valores fuera de rango");
                    RawPrinterHelper.SendStringToPrinter(impresora, "Error, valor fuera de rango\n"); // imprime texto
                }
            }
            public void CortaTicket()
            {
                string corte = "\x1B" + "m";                  // caracteres de corte
                string avance = "\x1B" + "d" + "\x09";        // avanza 9 renglones
                RawPrinterHelper.SendStringToPrinter(impresora, avance); // avanza
                RawPrinterHelper.SendStringToPrinter(impresora, corte); // corta
            }
            public void AbreCajon()
            {
                string cajon0 = "\x1B" + "p" + "\x00" + "\x0F" + "\x96";                  // caracteres de apertura cajon 0
                string cajon1 = "\x1B" + "p" + "\x01" + "\x0F" + "\x96";                 // caracteres de apertura cajon 1
                RawPrinterHelper.SendStringToPrinter(impresora, cajon0); // abre cajon0
                //RawPrinterHelper.SendStringToPrinter(impresora, cajon1); // abre cajon1
            }
        }
        #endregion
        #region Clase para enviar a imprsora texto plano
        public class RawPrinterHelper
        {
            // Structure and API declarions:
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public class DOCINFOA
            {
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDocName;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pOutputFile;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDataType;
            }
            [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

            [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool ClosePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

            [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndDocPrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartPagePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndPagePrinter(IntPtr hPrinter);

            [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

            // SendBytesToPrinter()
            // When the function is given a printer name and an unmanaged array
            // of bytes, the function sends those bytes to the print queue.
            // Returns true on success, false on failure.
            public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
            {
                Int32 dwError = 0, dwWritten = 0;
                IntPtr hPrinter = new IntPtr(0);
                DOCINFOA di = new DOCINFOA();
                bool bSuccess = false; // Assume failure unless you specifically succeed.

                di.pDocName = "My C#.NET RAW Document";
                di.pDataType = "RAW";

                // Open the printer.
                if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
                {
                    // Start a document.
                    if (StartDocPrinter(hPrinter, 1, di))
                    {
                        // Start a page.
                        if (StartPagePrinter(hPrinter))
                        {
                            // Write your bytes.
                            bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                            EndPagePrinter(hPrinter);
                        }
                        EndDocPrinter(hPrinter);
                    }
                    ClosePrinter(hPrinter);
                }
                // If you did not succeed, GetLastError may give more information
                // about why not.
                if (bSuccess == false)
                {
                    dwError = Marshal.GetLastWin32Error();
                }
                return bSuccess;
            }

            public static bool SendStringToPrinter(string szPrinterName, string szString)
            {
                IntPtr pBytes;
                Int32 dwCount;
                // 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;
            }
        }
        #endregion

    }

     

    TRATO DE PONER ESTE CODIGO EN UNA APLICACION DE CONSOLA Y SALE QUE MarshalAs NO SE ENCUENTRA EN EL CONTEXTO ACTUL..CUAL PUEDE SER EL PROBLEMS..?

    Tito Alomia V. Cel. 317 309 08 12

    Thursday, August 28, 2014 9:23 PM