为什么条形码文本值不在条形码下面打印?

时间:2013-02-19 18:44:29

标签: c# compact-framework windows-ce zebra-printers opennetcf

我使用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分(两天后,我估计)。

1 个答案:

答案 0 :(得分:2)

事实证明,问题在于我使用字体#2来获得12的字体大小(它是唯一提供该大小的字体)。字体#2的问题在于它是“OCR-A”,因此只打印某些字符。在我作为测试传递的字符串中(“The Life of Pi”,以及3.14的定价),它在该字符串中识别的唯一字符是P.所以这就是为什么它是我看到的唯一一个。< / p>

我必须使用字体#5(曼哈顿)或7(Warwick)将字体大小增加到下一个,即24,

来自zebra的“pk”为我提供了这些信息(“ OCR字体是一种特殊字体,不包括您要打印的所有字符。”)。

如果你看一下CPCL编程手册中的附录D,它确实将字体#2显示为“OCR-A”,但它并没有告诉我这意味着它的字符集排除了大多数字母字符。即使这对某些人来说显而易见,在我看来应该在手册中强调:打印文本时,不要使用字体#2!

注意:文本也应避免使用字体#6(MICR)。