POS应用开发 - 收据打印(POS Application Development - Recei

2019-07-03 20:42发布

我一直在为建设一个餐厅/酒吧POS应用。
该设计的部分已经完成,并在过去的一个月,我一直在对其进行编码。
除了现在我需要打印,一切工作正常。 我要打印到连接到运行该软件的计算机收据打印机以后我会尝试在远程打印机打印像一个厨房一个。

我搜索的帮助在这件事才发现,在这些类型的打印机打印的标准是使用POS为.NET。 问题是,现在这是一个有点过时,或者至少它没有因为几年任何更新。 有很多的问题被询问的关于如何使用这个库和大部分的答案都不太容易。 所以,如果有人可以给像收据打印机,我将非常感激一个简单的短语(“Hello World”的)打印一步步的帮助。
我使用的Visual Studio 2012在64位Windows 7上运行,我在C#编码WPF。

Answer 1:

POS用于.NET可能是要走的路。

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

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

OPOS / UPOS(关于这对于.NET POS基于)是一个恕我直言不良设计API(由设备制造商,而不是应用程序开发人员设计的),但它是你今天最好的。

我没有任何具体的样品,但基本是一样的OPOS - 你需要打开,索赔,启用的设备,那么你就可以调用它的方法(如打印)。 你可以尝试寻找一个OPOS样品,例如该PosPrinter1样本 ,这将可能是非常相似的POS为.NET。

这个博客有关于设置POS用于.NET可能有帮助的一些信息。

UPDATE

这里是一个VB的Hello World一个OPOS打印机。 首先,您需要创建一个打印机,并把它添加到所要求的逻辑设备名称= LDN注册表。 我相信爱普生ADK包括一个实用程序在注册表中添加打印机。 此实用程序还可以在打印机上执行健康检查,以检查它是否正确安装。 一旦你做到了这一点,它应该是很容易下面的代码适应POS为.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  


Answer 2:

我知道这是旧的文章,但对于那些还在寻找一个解决方案,我可以告诉你,我做了什么。

花很多时间与OPOS和POS搞乱了.NET之后,我最终放弃了刚刚和那些只使用内置System.Drawing.Printing库。 对于.NET的OPOS和POS结束了痛苦得到工作,最终没有为内置库正常工作。

我使用的是爱普生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
}

希望这可以帮助别人跳过所有瞎搞自定义驱动程序。 :)



Answer 3:

.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();
}

有几件事情要记住,虽然打印到收据打印机的时候,你需要考虑到的格式。 更具体地讲,你需要考虑你的页面的宽度和多少个字符,你可以适应每行; 这是一个大量的试验和错误对我来说,尤其是与不同的字体大小。

在大多数情况下,你并不真正需要担心的寻呼时,打印机会自动裁切纸张时,它已经完成了您的文档。



Answer 4:

如果你想在打印机的全速打印,您可能需要使用特定的打印机转义代码,并生成“原始”输出。

看看迈克尔·布恩的答案, 这太问题 ,尤其是UPDATE位。



文章来源: POS Application Development - Receipt Printing