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

我使用此页面将字体下载到打印机:转换和下载字体

这段代码循环遍历成员:

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正则或R反转文本。
\"{0}\" = 要打印的文本。

于 2011-07-07T13:09:48.293 回答
2

就个人而言,我总是自己创建画布。我基本上创建了一个“spooler”类,它是一个要打印的集合标签。标签本质上是一个类,其中包含标签的基本格式(一些是送货地址,一些包含零件号等),此外还有我可以填充以在标签模板中转储的属性。然后我构建一个打印文档,填充页面设置,并绑定到PrintPage事件并从队列中弹出标签。

我敢打赌,如果你降到打印机的驱动程序级别,发送完整的有效负载而不是序列化它会更好,但我认为一个接一个的工作就可以了。

不过,我有点好奇,在什么情况下一次性发送它们是不可取的?


进一步了解我是如何做到的:

首先,创建一个接口,指定“标签 [类]”必须公开的内容:

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 回答