web-dev-qa-db-ja.com

POSアプリケーション開発-レシート印刷

レストラン/バー用のPOSアプリケーションを作成しています。
設計の部分は完了し、先月コーディングしました。
印刷する必要がある場合を除き、すべて正常に動作します。ソフトウェアを実行しているコンピューターに接続されているレシートプリンターに印刷する必要があり、後でキッチンのようなリモートプリンターで印刷しようとします。

これらの種類のプリンターでの印刷の標準がPOS for .NETを使用していることだけを見つけるために、私は問題のヘルプを検索しました。問題は、これは今や少し時代遅れであるか、少なくとも数年前から更新されていないことです。このライブラリの使用方法については多くの質問が寄せられており、ほとんどの回答は簡単に理解できません。誰かがレシートプリンターで簡単なフレーズ(「Hello World」)のように印刷するためのステップごとのヘルプを提供できるなら、私は非常に感謝します。
64ビットWindows 7で実行されているVisual Studio 2012を使用しており、C#でWPFをコーディングしています。

17
Nuno

おそらくPOS for .NETが道のりです。

ほとんどのレシートプリンターメーカーは、OPOSサービスオブジェクトを提供します。

そして このMSDNの記事に記載されているように 、POS for .NETはOPOS v1.8サービスオブジェクトと互換性があります。

OPOS/UPOS(POS for .NETのベース)は、デザインが不十分なAPI(アプリケーション開発者ではなくデバイスメーカーが設計)ですが、今日の最高のAPIです。

特定のサンプルはありませんが、基本はOPOSと同じです。デバイスを開き、要求し、有効にする必要があります。その後、そのメソッド(印刷など)を呼び出すことができます。 this PosPrinter1 sample などのOPOSサンプルを試してみてください。これはおそらくPOS for .NETに非常によく似ています。

このブログ には、役立つPOSの設定に関する情報が含まれています。

[〜#〜] update [〜#〜]

OPOSプリンターの場合はVB Hello Worldです。最初にプリンターを作成し、必要な論理デバイス名= LDNでレジストリに追加する必要があります。EpsonADKには、レジストリにプリンターを追加しますこのユーティリティは、プリンターのヘルスチェックを実行して、プリンターが正しくインストールされていることを確認することもできます。

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  
12
Joe

私はこれが古い投稿であることを知っていますが、まだ解決策を探している人のために、私が何をしたかを伝えることができます。

.POSのOPOSとPOSをいじりながら多くの時間を費やした後、私はそれらを捨てて組み込みのSystem.Drawing.Printingライブラリ。 .POSの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
}

うまくいけば、誰かがカスタムドライバーをいじり回す手間を省くことができます。 :)

18
Tim S

。NET印刷

.NETでの印刷はそれほど難しくありません。 こちら および msdn をご覧ください。

POS /レシートプリンターへの印刷は、他のプリンターへの印刷と同じになります(Windowsプリンター、ネットワーク、またはその他の場合)。シリアルプリンターを使用している場合は、メーカー固有のAPIを使用する必要がある可能性が高いため、状況はもう少し難しくなります。幸いなことに、最近のほとんどの優れたPOSプリンターはOSによって完全にサポートされています。

最初に、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
nmaait

プリンタの最高速度で印刷する場合は、おそらくプリンタ固有のエスケープコードを使用し、「生の」出力を生成する必要があります。

this SO question 、特にUPDATEビットに対するMichael Buenの回答をご覧ください。

1
devstuff