21

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

私はこの問題について助けを求めましたが、これらのタイプのプリンターでの印刷の標準はPOSfor.NETを使用していることがわかりました。問題は、これは少し古くなっているか、少なくとも2、3年以来更新がないということです。このライブラリの使用方法については多くの質問が寄せられており、ほとんどの回答を簡単に理解することはできません。ですから、レシートプリンターで簡単なフレーズ(「HelloWorld」)のように印刷するためのステップバイステップのヘルプを誰かが提供できれば、私は非常に感謝しています。
64ビットのWindows7で実行されているVisualStudio2012を使用しており、C#でWPFをコーディングしています。

4

4 に答える 4

23

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

System.Drawing.PrintingOPOS と POS for .Net をいじるのに何時間も費やした後、私はそれらを放棄し、組み込みのライブラリだけを使用することになりました。.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
}

うまくいけば、誰かがカスタムドライバーをいじるのをすべてスキップするのに役立ちます. :)

于 2014-11-27T07:22:38.490 に答える
13

.NET 用の POS は、おそらく進むべき道です。

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

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

OPOS / UPOS (POS for .NET のベース) は、設計が不十分な API (アプリケーション開発者ではなくデバイス メーカーによって設計されたもの) ですが、現時点で最高のものです。

特定のサンプルはありませんが、基本は OPOS と同じです。デバイスを開く、要求する、有効にする必要があり、そのメソッド (印刷など) を呼び出すことができます。たとえば、この PosPrinter1 サンプルなどの 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  
于 2012-11-15T08:32:20.087 に答える
5

.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();
}

ただし、レシート プリンターで印刷する場合は、フォーマットを考慮する必要があります。具体的には、ページの幅と、各行に収まる文字数を考慮する必要があります。これは、特にさまざまなフォントサイズで、私にとって多くの試行錯誤でした.

ほとんどの場合、ページングについて実際に心配する必要はありません。ドキュメントが完成すると、プリンターは自動的に用紙をカットします。

于 2012-11-15T04:57:14.707 に答える
1

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

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

于 2012-11-15T06:08:34.960 に答える