2

次のように、オブジェクトのリストをループして、Memberそれらの名前とアドレス を出力したいと思います。

foreach (Member member in members) {
    sb.AppendLine();
    sb.AppendLine("N");
    sb.AppendLine(string.Format("A50,50,0,2,1,1,N,\"{0}\"", member.name));
    sb.AppendLine(string.Format("A50,50,0,2,1,1,N,\"{0}\"", member.address));
    sb.AppendLine("P1");

    RawPrinterHelper.SendStringToPrinter(printerName, sb.ToString());
}  

しかし、複数のラベルをプリンターに渡すもっと簡単な方法があるに違いありません。一度送信して、プリンターに一連の変数をループさせますか?

4

3 に答える 3

3

最後にこれを解決しました。OTisleyとからの回答を拡張するためのもう少しの情報を次に示しますBrad Chrisite

このページを使用してフォントをプリンターにダウンロードしました: Converting and Downloading Fonts .

そして、メンバーをループするこのコード:

StringBuilder sb = new StringBuilder();

foreach (Member member in members) {
    sb.AppendLine();
    sb.AppendLine("N");
    sb.AppendLine(string.Format("A10,10,0,b,1,1,N,\"{0}\"", member.name));
    sb.AppendLine(string.Format("A10,45,0,b,1,1,N,\"{0}\"", member.address));
    sb.AppendLine("P1,1");
}

string sendThisToPrinter = sb.ToString();

プリンターに送信されるフォーマットの説明:
A10 = ドット単位の左オフセット
10 = ドット単位の上部オフセット
0 = テキストの回転
b = フォントをプリンターにダウンロードしたときに設定したフォント名。
1 = テキストを横方向に x 回拡大します。
1 = テキストを縦方向 x の回数拡張します。
N = N ormalまたはReversed テキスト。
\"{0}\" = 印刷するテキスト。

于 2011-07-07T13:09:48.293 に答える
2

個人的には、私は常にキャンバスを自分で作成してきました。基本的に、印刷するラベルのコレクションである「スプーラ」クラスを作成しました。ラベルは基本的に、ラベルの基本的な形式 (配送先住所、部品番号など) を格納するクラスであり、ラベルのテンプレート内に入力してダンプできるプロパティに加えて、. 次に、印刷ドキュメントを作成し、ページ設定を入力して、PrintPageイベントにバインドし、キューからラベルをポップします。

プリンターのドライバーレベルに到達した場合、シリアル化するよりも完全なペイロードを送信する方がうまくいくと思いますが、1つずつ動作する必要があると思います.

ちょっと興味がありますが、1回限りの送信が望ましくないシナリオは何ですか?


私がどのようにそれを行うかについてのさらなる洞察:

まず、「ラベル [クラス]」が公開する必要があるものを指定するインターフェイスを作成します。

interface IPrintLabel
{
  // Get or set the printer this label should print from
  // I typically bounce between a Zebra (UPS/FedEx) printer and an in-house
  // DYNO printer, depending the label I print for shipping.
  PrinterSettings PrinterSettings { get; set; }

  // Get or set the paper size, margins, etc. Allows me to setup the canvas
  PageSettings PageSettings { get; set; }

  // Method responsible for laying out the label (send it the event args
  // from the PrintPage method of PrintDocument)
  void GenerateLabel(ref PrintPageEventArgs printArgs);

}

次に、特定のプロパティ、フォーマット、レイアウトなどを使用して、そのインターフェイスを実装するその他のクラスがあります。次に、「スプーラー」があります。

class PrintSpooler : Queue<IPrintLabel>
{
  public void PrintLabels()
  {
    // Establish a PrintDocument and bind to the PrintPage method something like:
    printDoc.PrintPage += (s, e) =>
    {
      IPrintLabel nextLabel = base.Dequeue();
      nextLabel.GenerateLabel(ref e);
      e.hasMorePages = (base.Count > 0);
    };
  }
}

すべて一般化されていますが、効果を与えるためだけです。これは約 3 年前のコードなので、より適切な方法や最適化された方法があるかもしれませんが、ここで作業を完了できます (そして締め切りに間に合いました)。

于 2011-07-05T15:34:27.787 に答える
1

Zebra プリンタとはどのようなものですか? ZPLは使えますか?セット、マップ、または配列を Zebra プリンターに渡すことはできませんが、フォーマットで変数を定義し、後で変数のみを渡すラベルを呼び出すことができます。これにより、実際にラベルを印刷する際のペイロードが削減されます。

ZPL では、^FN<Variable Number>コマンドを使用して、保存するラベル内に一連の変数を作成します。セットに含まれる変数の数と、ラベルに含まれる書式設定情報の量によっては、そのラベルが大きくなります。

そのラベルを印刷したい場合は、 を使用し^XF commandてラベルを呼び出し、変数データのみを渡すだけでよいため、すべてのラベル情報を渡す必要はありません。

保存されたラベル

^XA
^DFR:SAMPLE.GRF^FS
^FO20,30^GB750,1100,4^FS
^FO20,30^GB750,200,4^FS
^FO20,30^GB750,400,4^FS
^FO20,30^GB750,700,4^FS
^FO20,226^GB325,204,4^FS
^FO30,40^ADN,36,20^FDShip to:^FS
^FO30,260^ADN,18,10^FDPart number #^FS
^FO360,260^ADN,18,10^FDDescription:^FS
^FO30,750^ADN,36,20^FDFrom:^FS
^FO150,125^ADN,36,20^FN1^FS (ship to)
^FO60,330^ADN,36,20^FN2^FS(part num)
^FO400,330^ADN,36,20^FN3^FS(description)
^FO70,480^BY4^B3N,,200^FN4^FS(barcode)
^FO150,800^ADN,36,20^FN5^FS (from)
^XZ

ラベルを思い出す方法

^XA
^XFR:SAMPLE.GRF
^FN1^FDAcme Printing^FS
^FN2^FD14042^FS
^FN3^FDScrew^FS
^FN4^FD12345678^FS
^FN5^FDMacks Fabricating^FS
^XZ
于 2011-07-06T12:32:20.040 に答える