SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
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;
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
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-PVENTAGeneric / 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 Importen"; // 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 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
} // **********
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
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 rangon"); // imprime
texto
}
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)]
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.
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
}

Más contenido relacionado

La actualidad más candente

Ejemplos de algoritmos en C básicos (aprendiendo a programar)
Ejemplos de algoritmos en C básicos (aprendiendo a programar)Ejemplos de algoritmos en C básicos (aprendiendo a programar)
Ejemplos de algoritmos en C básicos (aprendiendo a programar)Kiim Kerrigan
 
Ejercicios resueltos de borland c++
Ejercicios resueltos de borland c++Ejercicios resueltos de borland c++
Ejercicios resueltos de borland c++JoseGCordero
 
Aritmetica
AritmeticaAritmetica
AritmeticaBOTICA
 
Lenguaje C
Lenguaje CLenguaje C
Lenguaje Cfior
 
Ejemplos Importantisimo
Ejemplos  ImportantisimoEjemplos  Importantisimo
Ejemplos Importantisimomartha leon
 
52 ejercicios en pseudocódigo
52 ejercicios en pseudocódigo52 ejercicios en pseudocódigo
52 ejercicios en pseudocódigoStefa Naranjo Meza
 
Ejercicios sencillos en c
Ejercicios sencillos en cEjercicios sencillos en c
Ejercicios sencillos en cAlma Navarro
 
Encriptacion y crackmes_en_batch_desde_0_by_xassiz
Encriptacion y crackmes_en_batch_desde_0_by_xassizEncriptacion y crackmes_en_batch_desde_0_by_xassiz
Encriptacion y crackmes_en_batch_desde_0_by_xassizChristian Chauca Bravo
 
52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigoVictor Morales
 
inicializando c#
inicializando c#inicializando c#
inicializando c#marthaleo36
 
52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigoCarlos Martir
 

La actualidad más candente (19)

Ejemplos de algoritmos en C básicos (aprendiendo a programar)
Ejemplos de algoritmos en C básicos (aprendiendo a programar)Ejemplos de algoritmos en C básicos (aprendiendo a programar)
Ejemplos de algoritmos en C básicos (aprendiendo a programar)
 
Algoritmos 50 ejemplos
Algoritmos 50 ejemplosAlgoritmos 50 ejemplos
Algoritmos 50 ejemplos
 
Ejercicios resueltos de borland c++
Ejercicios resueltos de borland c++Ejercicios resueltos de borland c++
Ejercicios resueltos de borland c++
 
Aritmetica
AritmeticaAritmetica
Aritmetica
 
Lenguaje C
Lenguaje CLenguaje C
Lenguaje C
 
Algoritmos en c++
Algoritmos en c++Algoritmos en c++
Algoritmos en c++
 
Pseudocodigo
PseudocodigoPseudocodigo
Pseudocodigo
 
pseudocodigo
pseudocodigopseudocodigo
pseudocodigo
 
Ejemplos Importantisimo
Ejemplos  ImportantisimoEjemplos  Importantisimo
Ejemplos Importantisimo
 
52 ejercicios en pseudocódigo
52 ejercicios en pseudocódigo52 ejercicios en pseudocódigo
52 ejercicios en pseudocódigo
 
Ejercicios sencillos en c
Ejercicios sencillos en cEjercicios sencillos en c
Ejercicios sencillos en c
 
algoritmos y Programacion
algoritmos y Programacionalgoritmos y Programacion
algoritmos y Programacion
 
Ejemplos de Pseudocodigos!!
Ejemplos de Pseudocodigos!!Ejemplos de Pseudocodigos!!
Ejemplos de Pseudocodigos!!
 
Lenguaje C_Curso Secap
Lenguaje C_Curso SecapLenguaje C_Curso Secap
Lenguaje C_Curso Secap
 
Encriptacion y crackmes_en_batch_desde_0_by_xassiz
Encriptacion y crackmes_en_batch_desde_0_by_xassizEncriptacion y crackmes_en_batch_desde_0_by_xassiz
Encriptacion y crackmes_en_batch_desde_0_by_xassiz
 
52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo
 
Hp
HpHp
Hp
 
inicializando c#
inicializando c#inicializando c#
inicializando c#
 
52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo
 

Destacado

Легко ли продавать контейнеры на базаре (Павел Емельянов)
Легко ли продавать контейнеры на базаре (Павел Емельянов)Легко ли продавать контейнеры на базаре (Павел Емельянов)
Легко ли продавать контейнеры на базаре (Павел Емельянов)Ontico
 
浅谈Scrum中的信任和勇气
浅谈Scrum中的信任和勇气浅谈Scrum中的信任和勇气
浅谈Scrum中的信任和勇气rex wang
 
Mongo Berlin - Mastering the Shell
Mongo Berlin - Mastering the ShellMongo Berlin - Mastering the Shell
Mongo Berlin - Mastering the ShellMongoDB
 
Tipos de sistemas operativos
Tipos de sistemas operativosTipos de sistemas operativos
Tipos de sistemas operativosMoraima Medina
 
BC Open Textbook Project
BC Open Textbook ProjectBC Open Textbook Project
BC Open Textbook ProjectClint Lalonde
 
Mic07 l03 v chuong3-hanh vi nguoi tieu dung
Mic07 l03 v chuong3-hanh vi nguoi tieu dungMic07 l03 v chuong3-hanh vi nguoi tieu dung
Mic07 l03 v chuong3-hanh vi nguoi tieu dungvtliem
 
20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....
20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....
20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....Takayoshi Tanaka
 
Manual tejeRedes parte I redes y comunidades colaborativas ver beta 2 final
Manual tejeRedes parte I redes y comunidades  colaborativas ver beta 2 finalManual tejeRedes parte I redes y comunidades  colaborativas ver beta 2 final
Manual tejeRedes parte I redes y comunidades colaborativas ver beta 2 finaltejeRedes
 
Твой эколоигческий след
Твой эколоигческий следТвой эколоигческий след
Твой эколоигческий следСНУЯЭиП
 
мій рідний край – запоріжжя
мій рідний край – запоріжжямій рідний край – запоріжжя
мій рідний край – запоріжжяalexstep
 
非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎
非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎
非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎schoowebcampus
 
#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...
#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...
#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...luca corsato
 
Lcm output 14.06.2011
Lcm output 14.06.2011Lcm output 14.06.2011
Lcm output 14.06.2011OSCE
 
1914 1945
1914 19451914 1945
1914 1945Udama
 
Algoritmos de Escalonamento
Algoritmos de EscalonamentoAlgoritmos de Escalonamento
Algoritmos de EscalonamentoEscalonamento
 

Destacado (20)

Легко ли продавать контейнеры на базаре (Павел Емельянов)
Легко ли продавать контейнеры на базаре (Павел Емельянов)Легко ли продавать контейнеры на базаре (Павел Емельянов)
Легко ли продавать контейнеры на базаре (Павел Емельянов)
 
浅谈Scrum中的信任和勇气
浅谈Scrum中的信任和勇气浅谈Scrum中的信任和勇气
浅谈Scrum中的信任和勇气
 
С детства просвещайся
С детства просвещайсяС детства просвещайся
С детства просвещайся
 
Badoo
BadooBadoo
Badoo
 
Mongo Berlin - Mastering the Shell
Mongo Berlin - Mastering the ShellMongo Berlin - Mastering the Shell
Mongo Berlin - Mastering the Shell
 
Tipos de sistemas operativos
Tipos de sistemas operativosTipos de sistemas operativos
Tipos de sistemas operativos
 
Tellagami
TellagamiTellagami
Tellagami
 
BC Open Textbook Project
BC Open Textbook ProjectBC Open Textbook Project
BC Open Textbook Project
 
Mic07 l03 v chuong3-hanh vi nguoi tieu dung
Mic07 l03 v chuong3-hanh vi nguoi tieu dungMic07 l03 v chuong3-hanh vi nguoi tieu dung
Mic07 l03 v chuong3-hanh vi nguoi tieu dung
 
20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....
20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....
20140510 Twitter Authentication by WebAuthentictionBroker in Windows Phone 8....
 
Manual tejeRedes parte I redes y comunidades colaborativas ver beta 2 final
Manual tejeRedes parte I redes y comunidades  colaborativas ver beta 2 finalManual tejeRedes parte I redes y comunidades  colaborativas ver beta 2 final
Manual tejeRedes parte I redes y comunidades colaborativas ver beta 2 final
 
Твой эколоигческий след
Твой эколоигческий следТвой эколоигческий след
Твой эколоигческий след
 
мій рідний край – запоріжжя
мій рідний край – запоріжжямій рідний край – запоріжжя
мій рідний край – запоріжжя
 
非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎
非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎
非ウェブデザイナーも知っておきたいデベロッパーツールの使い方(基本編 使い方と便利な機能) 先生:池田 祐太郎
 
Augmented reality
Augmented realityAugmented reality
Augmented reality
 
#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...
#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...
#beniculturaliaperti alla Borsa Mediterranea del Turismo Archeologico 2014 #B...
 
Lcm output 14.06.2011
Lcm output 14.06.2011Lcm output 14.06.2011
Lcm output 14.06.2011
 
1914 1945
1914 19451914 1945
1914 1945
 
Algoritmos de Escalonamento
Algoritmos de EscalonamentoAlgoritmos de Escalonamento
Algoritmos de Escalonamento
 
48 школа
48 школа48 школа
48 школа
 

Similar a Creacion e impresion de ticket de venta.

Similar a Creacion e impresion de ticket de venta. (20)

Ejercicios de programación en C (Estructuras condicionales-Selectivas)
Ejercicios de programación en C (Estructuras condicionales-Selectivas)Ejercicios de programación en C (Estructuras condicionales-Selectivas)
Ejercicios de programación en C (Estructuras condicionales-Selectivas)
 
Algoritmos resueltos
Algoritmos resueltosAlgoritmos resueltos
Algoritmos resueltos
 
Ejemplos c++
Ejemplos c++Ejemplos c++
Ejemplos c++
 
Jose
JoseJose
Jose
 
Ejemplos Para Dev C++
Ejemplos Para Dev C++Ejemplos Para Dev C++
Ejemplos Para Dev C++
 
Ejercicios en c sharp consola
Ejercicios en c sharp consolaEjercicios en c sharp consola
Ejercicios en c sharp consola
 
Vector
Vector Vector
Vector
 
Informe técnico 1
Informe técnico 1Informe técnico 1
Informe técnico 1
 
Programa1
Programa1Programa1
Programa1
 
Informe de informatica 16 17
Informe de informatica 16 17Informe de informatica 16 17
Informe de informatica 16 17
 
Union y concatenacion
Union y concatenacionUnion y concatenacion
Union y concatenacion
 
Do while ss
Do while ssDo while ss
Do while ss
 
Dfsi
Dfsi Dfsi
Dfsi
 
05 sentencias basicas
05 sentencias basicas05 sentencias basicas
05 sentencias basicas
 
Melanievp
MelanievpMelanievp
Melanievp
 
Do while
Do whileDo while
Do while
 
Escuela
EscuelaEscuela
Escuela
 
Escuela
EscuelaEscuela
Escuela
 
Algoritmos computacionales y programación: 3
Algoritmos computacionales y programación: 3Algoritmos computacionales y programación: 3
Algoritmos computacionales y programación: 3
 
2.introducción a las aplicaciones en c++
2.introducción a las aplicaciones en c++2.introducción a las aplicaciones en c++
2.introducción a las aplicaciones en c++
 

Creacion e impresion de ticket de venta.

  • 1. 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;
  • 2. 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
  • 3. 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-PVENTAGeneric / 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 Importen"; // agrega lineas de encabezados RawPrinterHelper.SendStringToPrinter(impresora, ticket); // imprime texto } public void TextoIzquierda(string par1) // agrega texto a la izquierda {
  • 4. 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 } // **********
  • 5. 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
  • 6. 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 rangon"); // imprime texto }
  • 7. 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)]
  • 8. 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.
  • 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 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 }