为什么条形码文本值没有打印在条形码下面
本文关键字:条形码 打印 文本 为什么 | 更新日期: 2023-09-27 18:00:05
我使用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"answers"."下面的一个孤独的"P"。
我的计算错了吗?
以下是我的想法:
标签为254点/1.25"高。
第一行从YPos0开始,以90像素的字体右对齐打印"3.14"。这印刷得很好。
第二行从YPos100开始(第一行90点以下10点),左对齐。我所看到的只是前面提到的"P",大小似乎合适。
第三行是条形码,位于YPos(120),居中;打印精细
第四行/最后一行是条形码下方的文本,居中;打印良好。
注:我还不能悬赏,但任何解决问题的人,我都会尽快(我估计两天后)奖励100分。
事实证明,问题是我使用字体#2是为了获得12的字体大小(它是唯一提供该大小的字体)。字体#2的问题是它是"OCR-A",因此只打印某些字符。在我作为测试通过的字符串中("Pi的一生",与3.14的标价一起),它在该字符串中唯一能识别的字符是P。所以这就是为什么它是我唯一看到的一个。
我不得不将我的字体大小增加到下一个可用的,即24,使用字体#5(曼哈顿)或7(华威)。
斑马的"mk"向我提供了此信息("OCR字体是一种特殊字体,不包括您试图打印的所有字符。")。
如果你看一下CPCL编程手册中的附录D,它确实将字体#2显示为"OCR-A",但我并没有意识到这意味着它的字符集排除了大多数字母字符。即使这对一些人来说是显而易见的,但在我看来,手册中应该强调:打印文本时,不要使用字体#2!
注意:文本也应避免使用字体#6(MICR)。