Подтвердить что ты не робот

Разработка приложений POS - печать чеков

Я создаю приложение POS для ресторана/бара.




















< Распечатать. Я должен печатать на принтере квитанции, подключенном к компьютеру, на котором запущено программное обеспечение, и позже я попытаюсь напечатать на удаленном принтере, как на кухне.

Я искал помощь в этом вопросе только для того, чтобы найти, что стандарт для печати на этих типах принтеров использует POS для .NET. Дело в том, что сейчас это немного устарело или, по крайней мере, у него не было никаких обновлений с двух лет. Там много вопросов, которые задают вопрос о том, как использовать эту библиотеку, и большинство ответов не совсем легко следовать. Поэтому, если кто-нибудь может дать пошаговую помощь при печати, как простую фразу ( "Hello World" ) на принтере квитанции, я был бы очень благодарен.
Я использую Visual Studio 2012, работающую на 64-битных Windows 7 и я кодирую WPF в С#.

4b9b3361

Ответ 1

POS для .NET - это, вероятно, путь.

Большинство производителей принтеров квитанций предоставят объект службы OPOS.

И как говорится в статье MSDN, POS для .NET совместим с объектами службы OPOS v1.8.

OPOS/UPOS (на котором основана POS для .NET) - это IMHO плохо разработанный API (разработанный производителями устройств, а не разработчиками приложений), но это лучшее, что у вас есть сегодня.

У меня нет конкретных образцов, но основы такие же, как OPOS - вам нужно открыть, утвердить, включить устройство, а затем вы можете вызвать его методы (например, Print). Вы можете попробовать использовать образец OPOS, например этот пример PosPrinter1, который, вероятно, будет очень похож на POS для .NET.

В этом блоге есть информация о настройке POS для .NET, которая может быть полезна.

UPDATE

Здесь VB Hello World для принтера OPOS. Сначала вам нужно создать принтер и добавить его в реестр с требуемым именем логического устройства = LDN. Я считаю, что Epson 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  

Ответ 2

Я знаю, что это старый пост, но для тех, кто все еще ищет решение, я могу рассказать вам, что я сделал.

Потратив много времени на использование OPOS и POS для .Net, я просто оставил их и просто использовал встроенные библиотеки System.Drawing.Printing. OPOS и POS для .Net оказались больно работать и, в конечном счете, не работали, а также встроенные библиотеки.

Я использую принт-принтер 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
}

Надеюсь, это поможет кому-то пропустить все беспорядки с помощью пользовательских драйверов.:)

Ответ 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();
}

Несколько вещей, о которых нужно помнить, но при печати на принтере квитанции вам нужно будет принять во внимание форматирование. Более конкретно вам нужно будет рассмотреть ширину вашей страницы и количество символов, которые вы можете поместить в каждую строку; это было много проб и ошибок для меня, особенно с разными размерами шрифтов.

В большинстве случаев вам не нужно беспокоиться о пейджинге, принтер автоматически обрезает бумагу, когда он завершит ваш документ.

Ответ 4

Если вы хотите печатать на полной скорости принтера, вам, вероятно, понадобится использовать управляющие коды для принтера и создать "сырой" выход.

Посмотрите на ответ Майкла Буэна на этот вопрос SO, особенно бит UPDATE.