首页 文章

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

提问于
浏览
17

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

我've searched for help in the matter only to find that the standard for printing in these types of printers is using POS for .NET. The thing is, this is now a bit outdated or at least it hasn'几年后有任何更新 . 有's a lot of questions being asked on how to use this library and most of the answers aren'很容易遵循 . 因此,如果有人可以在收据打印机上像一个简单的短语("Hello World")那样一步一步地帮助打印,我将非常感激 .
我'm using visual studio 2012 running on a 64 bit windows 7 and i'm在c#中编写WPF .

4 回答

  • 1

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

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

    并且as this MSDN article states,POS for .NET与OPOS v1.8服务对象兼容 .

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

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

    This blog有一些关于为.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
    
  • 10

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

    花了好几个小时搞乱了.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
    }
    

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

  • 15

    .NET Printing

    在.NET下打印并不太难 . 看看heremsdn .

    打印到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();
    }
    

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

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

  • 4

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

    看看Michael Buen对this SO question的回答,特别是UPDATE位 .

相关问题