我正在使用 Windows Compact Framework 打印到使用 OpenNetCF 串行端口类和 CPCL 的 Zebra 皮带打印机。打印的标签与应有的差不多,但条码值并未按应有的方式打印在条码下方。
我创建了一个要发送到打印机的命令的 ArrayList,然后一次将它们传递给串行端口。如果提供值的控件为空,我会使用一些虚拟数据,如下所示:
private void btnPrint_Click(object sender, System.EventArgs e)
{
string listPrice = txtList.Text;
if (listPrice.Trim() == string.Empty)
{
listPrice = "3.14";
}
string description = txtDesc.Text;
if (description.Trim() == string.Empty)
{
description = "The Life of Pi";
}
string barcode = txtUPC.Text;
if (barcode.Trim() == string.Empty)
{
barcode = "01701013992";
}
ArrayList arrList = new ArrayList();
arrList.Add("! 0 200 200 120 1\r\n"); // replace 120 with label height if different than 1.25"/120 pixels (at 96 pixels per inch)
arrList.Add("RIGHT\r\n");
arrList.Add(string.Format("TEXT 0 5 0 0 {0}\r\n", listPrice));
arrList.Add("LEFT\r\n");
arrList.Add(string.Format("TEXT 0 0 0 52 {0}\r\n", description));
arrList.Add("CENTER\r\n");
arrList.Add("BARCODE-TEXT 0 0 5\r\n");
arrList.Add(string.Format("BARCODE 128 1 1 50 0 77 {0}\r\n", barcode));
arrList.Add("FORM\r\n");
arrList.Add("PRINT\r\n");
PrintUtils pu = new PrintUtils();
pu.PrintLabel(arrList);
}
public void PrintLabel(ArrayList linesToSend)
{
using (SerialPort serialPort = new SerialPort())
{
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.PortName = "COM1:";
serialPort.Open();
Thread.Sleep(500); //this may not even be necessary and, if so, a different value may be better
foreach (string line in linesToSend)
{
serialPort.Write(line);
}
serialPort.Close();
}
}
...问题是标签(当我允许打印虚拟数据时)应该是:
3.14
The Life of Pi
<barcode here>
01701013992
...这是真正打印的内容:
3.14
The Life of Pi
<barcode here>
[blank]
所以问题是条形码作为文本(“01701013992”)没有打印在条形码下方。
有谁知道为什么会发生这种情况,即使我在那里有一个 BARCODE-TEXT 命令,以及如何纠正它?
更新
我收到了一条关键信息,即标签高度(在我的情况下)应该是 254,而不是 120(对于我的 1.25 英寸高度标签,我是根据 96 像素 == 1 英寸计算的,但实际上这个特定的打印机是 203 dpi,所以 1.25 X == 254(更准确地说是 253.75,但 254 已经足够接近了)。
所以代码变成了这样:
// Command args (first line, prepended with a "!": horizontal (X) pos, resolution, resolution, label height, copies
// TEXT args are: fontNumber, fontSizeIdentifier, horizontal (X) pos, vertical (Y) pos
// BARCODE args are: barcodeType, unitWidthOfTheNarrowBar, ratioOfTheWideBarToTheNarrowBar, unitHeightOfTheBarCode,
// horizontal (X) pos, vertical (Y) pos, barcodeValue
// BARCODE-TEXT args are: fontNumber, fontSizeIdentifier, space between barcode and -text
// 1 inch = 203 dots (Zebra QL220 is a 203 dpi printer); font 4,3 == 90 pixels; font 2,0 == 12 pixels
arrList.Add("! 0 200 200 254 1\r\n"); // 203 dpi X 1.25 = 254
arrList.Add("RIGHT\r\n");
arrList.Add(string.Format("TEXT 4 3 0 0 {0}\r\n", listPrice));
arrList.Add("LEFT\r\n");
arrList.Add(string.Format("TEXT 2 0 0 100 {0}\r\n", description));
arrList.Add("BARCODE-TEXT 2 0 5\r\n");
arrList.Add("CENTER\r\n");
arrList.Add(string.Format("BARCODE 128 1 1 50 0 120 {0}\r\n", barcode));
arrList.Add("FORM\r\n");
arrList.Add("PRINT\r\n");
...但我仍然没有看到描述标签 - 除了“3”和“。”下方的孤独的“P”。在价格上。
是我的计算错误,还是什么?
这就是我认为我所拥有的:
标签高 254 点/1.25 英寸。
第一行从 YPos 0 开始,以 90 像素字体打印“3.14”,右对齐。那打印得很好。
第二行从 YPos 100 开始(在 90 点的第一行下方 10 个点),左对齐。我所看到的只是前面提到的“P”,尺寸似乎合适。
第三行是条形码,位于 YPos (120) 处,居中;打印良好
第四行/最后一行是条形码作为条形码下方的文本,居中;打印良好。
注意:我还不能为此悬赏,但任何解决它的人我都会尽快奖励 100 分(我估计在两天内)。