POS应用程序开发 – 收据打印

我一直在为餐馆/酒吧建立一个POS应用程序。
设计部分已经完成,过去一个月我一直在编码。
一切正常,但现在我需要打印。 我必须打印到连接到运行软件的计算机的收据打印机,然后我会尝试在像厨房一样的远程打印机上打印。

我在这个问题上寻求帮助,却发现这些类型的打印机的打印标准是使用POS for .NET。 问题是,这已经过时了,或者至少几年后它没有任何更新。 关于如何使用这个库有很多问题,大多数答案都不容易理解。 因此,如果任何人可以在收据打印机上像一个简单的短语(“Hello World”)一步一步地帮助打印,我将非常感激。
我正在使用64位Windows 7上运行的visual studio 2012,我在c#中编写WPF代码。

POS for .NET可能是要走的路。

大多数收据打印机制造商将提供OPOS服务对象。

正如这篇MSDN文章所述 ,POS for .NET与OPOS v1.8服务对象兼容。

OPOS / UPOS(基于.NET的POS)是恕我直言,设计不佳的API(由设备制造商而不是应用程序开发人员设计),但它是您今天拥有的最好的。

我没有任何具体的样本,但基本知识与OPOS相同 – 您需要打开,声明,启用设备,然后您可以调用其方法(如打印)。 您可以尝试查看OPOS示例,例如此PosPrinter1示例 ,它可能与POS for .NET非常相似。

此博客提供了有关为.NET设置POS可能有用的一些信息。

UPDATE

这是一个用于OPOS打印机的VB Hello World。 首先需要创建一台打印机,并使用所需的逻辑设备名称= LDN将其添加到注册表中。 我相信Epson ADK包含一个在注册表中添加打印机的实用程序。 此实用程序还可以对打印机执行运行状况检查,以检查它是否已正确安装。 一旦你完成了这个,它应该很容易使下面的代码适应.NET for .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 

我知道这是一个老post,但对于那些仍在寻找解决方案的人,我可以告诉你我做了什么。

花了好几个小时搞乱了.Net的OPOS和POS后,我最后放弃了那些,只使用了内置的System.Drawing.Printing库。 .Net的OPOS和POS最终成为一种痛苦的工作,并最终没有内置库那么好用。

我正在使用Epson TM-T20II收据打印机。

这里有一些适合我的代码。

 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 } 

希望它有助于有人跳过所有与自定义驱动程序的混乱。 🙂

.NET打印

在.NET下打印并不太难。 看看这里和msdn 。

打印到POS /收据打印机与打印到任何其他打印机相同,假设它是Windows打印机,网络或其他。 如果您使用的是串行打印机,事情可能会有点困难,因为您可能更需要使用制造商特定的API,幸运的是,目前大多数优秀的POS打印机都得到操作系统的全面支持。

首先,您需要向项目添加对System.Printing dll的引用。

然后打印就像

 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"); } 

使用..

 PrintText("Hello World"); 

您还可以利用PrintDialog.PrintVisual并使用xaml模板定义文档。

可以使用PrintDialog属性设置打印设置。

获取要打印的打印机

 private PrintQueue FindPrinter(string printerName) { var printers = new PrintServer().GetPrintQueues(); foreach (var printer in printers) { if (printer.FullName == printerName) { return printer; } } return LocalPrintServer.GetDefaultPrintQueue(); } 

要记住打印到收据打印机时要记住的一些事项,您需要考虑格式化。 更具体地说,您需要考虑页面的宽度以及每行可以容纳的字符数; 对我来说这是一个很多的试验和错误,特别是对于不同的字体大小。

在大多数情况下,您并不需要担心分页,打印机会在完成文档后自动剪切纸张。

如果要以打印机的全速打印,则可能需要使用特定于打印机的转义码,并生成“原始”输出。

看看Michael Buen对这个SO问题的回答,特别是UPDATE位。