我一直在为餐馆/酒吧建造一个POS应用程序。
设计部分已经完成,过去一个月我一直在编码。
一切都很好,除非我现在需要打印。我必须打印到连接到运行该软件的计算机的收据打印机,然后我将尝试在像厨房一样的远程打印机上打印。
我在这个问题上寻求帮助,却发现这些类型的打印机的打印标准是使用POS for .NET。问题是,这已经过时了,或者至少几年后它没有任何更新。关于如何使用这个库有很多问题,大多数答案都不容易理解。因此,如果有人可以在收据打印机上像一个简单的短语(“Hello World”)那样一步一步地帮助打印,我将非常感激。
我正在使用64位Windows 7上运行的visual studio 2012我在c#中编写WPF代码。
答案 0 :(得分:15)
我知道这是一个老帖子,但对于那些仍在寻找解决方案的人,我可以告诉你我做了什么。
在花了几个小时搞乱.OS的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
}
希望它有助于有人跳过所有使用自定义驱动程序的麻烦。 :)
答案 1 :(得分:11)
POS for .NET可能是最佳选择。
大多数收据打印机制造商都会提供OPOS服务对象。
而且as this MSDN article states,POS for .NET与OPOS v1.8服务对象兼容。
OPOS / UPOS(基于.NET的POS)是IMHO设计不佳的API(由设备制造商而不是应用程序开发人员设计),但它是您今天拥有的最佳产品。
我没有任何具体样本,但基本知识与OPOS相同 - 您需要打开,声明,启用设备,然后您可以调用其方法(例如打印)。您可以尝试查看OPOS示例,例如this PosPrinter1 sample,它可能与POS for .NET非常相似。
This blog提供了一些有关为.NET设置POS可能有用的信息。
<强>更新强>
这是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
答案 2 :(得分:4)
.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");
您还可以利用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();
}
在打印到收据打印机时要记住一些事项,您需要考虑格式化。更具体地说,您需要考虑页面的宽度以及每行可以容纳的字符数;对我来说这是一个很多的试验和错误,特别是对于不同的字体大小。
在大多数情况下,您并不需要担心分页,打印机会在完成文档后自动剪纸。
答案 3 :(得分:1)
如果要以打印机的全速打印,可能需要使用特定于打印机的转义码,并生成“原始”输出。
查看Michael Buen对this SO question的回答,尤其是UPDATE位。