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