Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# POS应用程序开发-收据打印_C#_Wpf_Printing_Epson_Receipt - Fatal编程技术网

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

C# POS应用程序开发-收据打印,c#,wpf,printing,epson,receipt,C#,Wpf,Printing,Epson,Receipt,我一直在为一家餐厅/酒吧构建POS应用程序。设计部分已经完成,在过去的一个月里,我一直在对其进行编码。除了现在需要打印外,一切正常。我必须打印到连接到运行该软件的计算机的收据打印机上,稍后我将尝试在远程打印机上打印,如厨房打印机 我搜索了这方面的帮助,却发现这类打印机的打印标准是使用POS for.NET。问题是,它现在有点过时了,或者至少几年来没有任何更新。有很多关于如何使用这个库的问题被问到,大多数答案都不太容易理解。因此,如果有人能在收据打印机上提供一个简单短语(“Hello World”

我一直在为一家餐厅/酒吧构建POS应用程序。
设计部分已经完成,在过去的一个月里,我一直在对其进行编码。
除了现在需要打印外,一切正常。我必须打印到连接到运行该软件的计算机的收据打印机上,稍后我将尝试在远程打印机上打印,如厨房打印机


我搜索了这方面的帮助,却发现这类打印机的打印标准是使用POS for.NET。问题是,它现在有点过时了,或者至少几年来没有任何更新。有很多关于如何使用这个库的问题被问到,大多数答案都不太容易理解。因此,如果有人能在收据打印机上提供一个简单短语(“Hello World”)的打印帮助,我将不胜感激。
我使用的是运行在64位windows 7上的visual studio 2012,我正在用c#编写WPF

.NET打印

在.NET下打印并不太困难。看一看,接着看

在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");
您还可以利用,并使用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对的回答,尤其是更新部分。

POS for.NET可能是一条可行的道路

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

而且,POS for.NET与OPOS v1.8服务对象兼容

OPOS/UPOS(POS for.NET的基础)是一个设计拙劣的API(由设备制造商而不是应用程序开发人员设计),但它是当今最好的API

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

有一些关于为.NET设置POS的信息可能会有所帮助

更新

这是一个OPOS打印机的VB Hello World。首先需要创建一台打印机,并使用所需的逻辑设备名=LDN将其添加到注册表中。我相信Epson ADK包含一个在注册表中添加打印机的实用程序。此实用程序还可以对打印机执行运行状况检查,以检查打印机是否正确安装。完成此操作后,将下面的代码改编为POS 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  

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

在花了好几个小时摆弄OPOS和POS for.Net之后,我最终放弃了它们,只使用了内置的
系统.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
}

希望它能帮助人们跳过所有与定制驱动程序有关的麻烦事。:)

现在打印是一个操作系统问题。。。你必须自己写驱动程序的日子一去不复返了(天啊,我想念它)。这意味着什么?我真的不明白你的评论。。POS应用程序每天都在开发中,因此显然有很多方法可以打印到收据打印机上。您是否已决定使用您计划使用的打印机,因为您最有可能使用的是制造商API或软件驱动程序这是我使用星型打印机打印的解决方案,你可以尝试寻找爱普生打印机的助手,我想我会指出什么应该是显而易见的,但通常不是:制造商通常希望你使用他们的产品,因此,如果你打电话给他们,他们通常会很高兴为你指出正确的方向。它们不会帮助您解决任何特定于应用程序的问题,但它们通常可以为您提供打印“Hello World!”所需的信息。不要按照链接问题中的建议使用通用打印机。专业POS应用程序将要监视收据打印机的状态信号(例如,纸张不足、盖子打开、卡纸),这在使用普通打印机时是不可用的。@Joe,拜托!当我说“专业POS应用程序将要监视收据打印机的状态信号(例如,纸张不足、盖子打开、卡纸)”时,人们会嘲笑我,认为我是个迟钝的人。很少有应用程序/人关心这些。我也要提出一个问题“打印到POS/Receipt打印机将与打印到任何其他打印机相同”-不要这样做。专业POS应用程序需要监控来自收据打印机的状态信号(例如,纸张不足、盖子打开、卡纸),这些信号在使用Wind时不可用