Sie sind auf Seite 1von 9

Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn

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 disee 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 diseo 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 cajn".
El siguiente ejemplo es demostrativo y consiste solo en un boton, que al presionar imprime un
pequeo 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;
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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
{
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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
} // **********
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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
}
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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)]
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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.
Programador y Analista de sistemas Autor: Santos Nilo Rivera Lujn
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
}

Das könnte Ihnen auch gefallen