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

Nun*_*uno 17 c# printing wpf epson receipt

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

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

Tim*_*m S 18

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

花了好几个小时搞乱了.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
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助有人跳过所有与自定义驱动程序的混乱.:)


Joe*_*Joe 12

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

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

作为这个MSDN文章指出,POS为.NET与OPOS V1.8服务对象是兼容的.

OPOS/UPOS(基于.NET的POS)是IMHO设计不佳的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  
Run Code Online (Sandbox Code Playgroud)


nma*_*ait 5

.NET 打印

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

打印到 POS/收据打印机将与打印到任何其他打印机相同,假设它是 Windows 打印机、网络或其他。如果您使用的是串行打印机,事情可能会稍微困难一些,因为您可能更需要使用制造商特定的 API,幸运的是,尽管现在操作系统完全支持大多数优秀的 POS 打印机。

首先,您需要在项目中添加对System.Printingdll的引用。

那么打印就这么简单

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");
}
Run Code Online (Sandbox Code Playgroud)

要使用..

PrintText("Hello World");
Run Code Online (Sandbox Code Playgroud)

您还可以利用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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • “打印到 POS/收据打印机与打印到任何其他打印机相同” - 不要这样做。专业的 POS 应用程序需要监控收据打印机的状态信号(例如纸张不足、盖子打开、卡纸),而使用 Windows 打印机驱动程序时这些信号不可用。 (2认同)