c# - squareup - Desarrollo de aplicaciones POS-Impresión de recibos
square terminal (4)
He estado construyendo una aplicación POS para un restaurante / bar.
La parte de diseño está hecha y durante el mes pasado la he estado codificando.
Todo funciona bien, excepto que ahora necesito imprimir. Tengo que imprimir en una impresora de recibos conectada a la computadora que ejecuta el software y luego intentaré imprimir en una impresora remota como la de una cocina.
He buscado ayuda en el asunto solo para encontrar que el estándar para imprimir en este tipo de impresoras es usar POS para .NET. El problema es que ahora está un poco desactualizado o al menos no ha tenido actualizaciones desde hace un par de años. Se hacen muchas preguntas sobre cómo usar esta biblioteca y la mayoría de las respuestas no son fáciles de seguir. Por lo tanto, si alguien pudiera brindar ayuda paso a paso en la impresión como una simple frase ("Hola mundo") en una impresora de recibos, estaría muy agradecido.
Estoy usando Visual Studio 2012 corriendo en Windows 7 de 64 bits y estoy codificando WPF en c #.
POS para .NET es probablemente el camino a seguir.
La mayoría de los fabricantes de impresoras de recibos proporcionarán un objeto de servicio OPOS.
Y como indica este artículo de MSDN , POS para .NET es compatible con los objetos de servicio OPOS v1.8.
OPOS / UPOS (en el que se basa POS para .NET) es, en mi opinión, una API mal diseñada (diseñada por fabricantes de dispositivos en lugar de desarrolladores de aplicaciones), pero es lo mejor que tiene hoy.
No tengo ninguna muestra específica, pero lo básico es lo mismo que OPOS: necesita abrir, reclamar, habilitar un dispositivo, luego puede llamar a sus métodos (como Imprimir). Puede intentar ver una muestra de OPOS, por ejemplo, esta muestra de PosPrinter1 , que probablemente será muy similar a POS para .NET.
Este blog tiene información sobre la configuración de POS para .NET que podría ser útil.
ACTUALIZAR
Aquí hay un VB Hello World para una impresora OPOS. Primero debe crear una impresora y agregarla al registro con el nombre de dispositivo lógico requerido = LDN. Creo que el Epson ADK incluye una utilidad para agregar una impresora en el registro. Esta utilidad también puede realizar una comprobación de estado en la impresora para verificar que esté instalada correctamente. Una vez que haya hecho esto, debería ser bastante fácil adaptar el código a continuación a POS para .NET
OPOSPOSPrinter.Open "MyPrinter" '' LDN of your printer
OPOSPOSPrinter.Claim 500 '' Timeout
OPOSPOSPrinter.DeviceEnabled = True
''- Print
OPOSPOSPrinter.PrintNormal 2, "Hello world"
''- Close the printer
If OPOSPOSPrinter.Claimed then
OPOSPOSPrinter.Release
End If
OPOSPOSPrinter.Close
Sé que este es un post antiguo, pero para aquellos que todavía están buscando una solución, les puedo decir lo que hice.
Después de pasar muchas horas jugando con OPOS y POS para .Net, terminé simplemente abandonándolos y usando las bibliotecas System.Drawing.Printing
integradas. Los OPOS y POS para .Net terminaron siendo una molestia para trabajar y, en última instancia, no funcionaron tan bien como las bibliotecas integradas.
Estoy usando una impresora de recibos Epson TM-T20II.
Aquí hay un código que funcionó bien para mí.
public static void PrintReceiptForTransaction()
{
PrintDocument recordDoc = new PrintDocument();
recordDoc.DocumentName = "Customer Receipt";
recordDoc.PrintPage += new PrintPageEventHandler(ReceiptPrinter.PrintReceiptPage); // function below
recordDoc.PrintController = new StandardPrintController(); // hides status dialog popup
// Comment if debugging
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "EPSON TM-T20II Receipt";
recordDoc.PrinterSettings = ps;
recordDoc.Print();
// --------------------------------------
// Uncomment if debugging - shows dialog instead
//PrintPreviewDialog printPrvDlg = new PrintPreviewDialog();
//printPrvDlg.Document = recordDoc;
//printPrvDlg.Width = 1200;
//printPrvDlg.Height = 800;
//printPrvDlg.ShowDialog();
// --------------------------------------
recordDoc.Dispose();
}
private static void PrintReceiptPage(object sender, PrintPageEventArgs e)
{
float x = 10;
float y = 5;
float width = 270.0F; // max width I found through trial and error
float height = 0F;
Font drawFontArial12Bold = new Font("Arial", 12, FontStyle.Bold);
Font drawFontArial10Regular = new Font("Arial", 10, FontStyle.Regular);
SolidBrush drawBrush = new SolidBrush(Color.Black);
// Set format of string.
StringFormat drawFormatCenter = new StringFormat();
drawFormatCenter.Alignment = StringAlignment.Center;
StringFormat drawFormatLeft = new StringFormat();
drawFormatLeft.Alignment = StringAlignment.Near;
StringFormat drawFormatRight = new StringFormat();
drawFormatRight.Alignment = StringAlignment.Far;
// Draw string to screen.
string text = "Company Name";
e.Graphics.DrawString(text, drawFontArial12Bold, drawBrush, new RectangleF(x, y, width, height), drawFormatCenter);
y += e.Graphics.MeasureString(text, drawFontArial12Bold).Height;
text = "Address";
e.Graphics.DrawString(text, drawFontArial10Regular, drawBrush, new RectangleF(x, y, width, height), drawFormatCenter);
y += e.Graphics.MeasureString(text, drawFontArial10Regular).Height;
// ... and so on
}
Esperemos que ayude a alguien a saltarse todos los problemas con los controladores personalizados. :)
Si desea imprimir a la máxima velocidad de la impresora, probablemente necesitará usar códigos de escape específicos de la impresora y generar la salida "en bruto".
Eche un vistazo a la respuesta de Michael Buen a esta pregunta SO , especialmente el bit ACTUALIZAR.
Impresión .NET
Imprimir bajo .NET no es demasiado difícil. Echa un vistazo here y en msdn .
Imprimir en una impresora de POS / recibos será igual a imprimir en cualquier otra impresora, suponiendo que se trate de una impresora de Windows, de una red u otra. Si está utilizando una impresora en serie, las cosas pueden ser un poco más difíciles porque probablemente necesitará usar API específicas del fabricante, aunque afortunadamente la mayoría de las buenas impresoras POS en estos días son totalmente compatibles con el sistema operativo.
Primero, deberá agregar una referencia a System.Printing
dll a su proyecto.
Entonces la impresión es tan simple como
private void PrintText(string text)
{
var printDlg = new PrintDialog();
var doc = new FlowDocument(new Paragraph(new Run(text)));
doc.PagePadding = new Thickness(10);
printDlg.PrintDocument((doc as IDocumentPaginatorSource).DocumentPaginator, "Print Caption");
}
Usar..
PrintText("Hello World");
También puede aprovechar PrintDialog.PrintVisual y definir su documento usando la plantilla xaml.
La configuración de impresión se puede establecer utilizando las propiedades PrintDialog.
Obtener la impresora que desea imprimir en
private PrintQueue FindPrinter(string printerName)
{
var printers = new PrintServer().GetPrintQueues();
foreach (var printer in printers)
{
if (printer.FullName == printerName)
{
return printer;
}
}
return LocalPrintServer.GetDefaultPrintQueue();
}
Sin embargo, hay que tener en cuenta algunas cosas al imprimir en una impresora de recibos, deberá tener en cuenta el formato. Más específicamente, deberá considerar el ancho de su página y cuántos caracteres puede colocar en cada línea; Esto fue un montón de prueba y error para mí, especialmente con diferentes tamaños de fuente.
En la mayoría de los casos, realmente no necesita preocuparse por la paginación, la impresora cortará el papel automáticamente cuando haya completado su documento.