creacion e impresion de ticket de venta

9
Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján Mi Web :http://riverasn.p.ht/ Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo Mi Grupo: Programadores : https://www.facebook.com/groups/398604720248657/ CREACION E IMPRESION DE TICKET DE VENTA Visual C# 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;

Upload: santos-rivera-lujan

Post on 22-Jun-2015

1.149 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

Mi Grupo: Programadores : https://www.facebook.com/groups/398604720248657/

CREACION E IMPRESION DE TICKET DE VENTA

Visual C#

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;

Page 2: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

// 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

Page 3: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

// 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

{

Page 4: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

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

} // **********

Page 5: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

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

Page 6: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

} // **********

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

}

Page 7: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

}

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

Page 8: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

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.

Page 9: Creacion e impresion de ticket de venta

Programador y Analista de sistemas Autor: Santos Nilo Rivera Luján

Mi Web :http://riverasn.p.ht/

Creacion e impresion de ticket de venta. Colaborador : Alejandro Romero Sotelo

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

}