我想循环遍历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());
}
但肯定有一种更简单的方法可以将多个标签传递给打印机吗?发送一次,让打印机循环一组变量?
答案 0 :(得分: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或 R 已翻阅的文字。
\“{0} \” =要打印的文字。
答案 1 :(得分:2)
就个人而言,我总是自己创建画布。我基本上创建了一个“spooler”类,它是一个要打印的集合标签。标签本质上是一个包含标签基本格式的类(一些是发货地址,一些包含部件号等),以及我可以填充以在标签模板中转储的属性。然后,我构建一个打印文档,填充页面设置,并绑定到PrintPage
事件并从队列中弹出标签。
我敢打赌,如果你达到了打印机的驱动程序级别,那么发送一个完整的有效载荷比串行化它更好,但我认为一个接一个只需要工作。
我有点好奇,这种情况一次性发送是不可取的?
首先,创建一个指定“label [class]”必须公开的接口:
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);
}
然后我有misc类来实现该接口。具有特定的属性,格式,布局等。然后我有一个“假脱机程序”:
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年代的旧代码,因此可能有更好/更优化的方法,但它可以在这里完成工作(并让我到截止日期)。
答案 2 :(得分: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