Почему текстовое значение штрих-кода не печатается под штрих-кодом?

Я печатаю, используя Windows Compact Framework, на ленточный принтер Zebra, используя класс последовательного порта OpenNetCF и CPCL. Печатная этикетка выглядит так, как и должно быть, но значение штрих-кода не печатается под штрих-кодом, как должно.

Я создаю 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 точек на дюйм, поэтому 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");

... но я все еще не вижу метку описания - за исключением одинокого "P" ниже "3" и "." в цене.

Мои расчеты неверны или как?

Вот что я думаю, что у меня есть:

Этикетка имеет высоту 254 точки /1,25 дюйма.

Первая строка начинается с YPos 0 и печатает "3.14" шрифтом 90 пикселей по правому краю. Это печатает хорошо.

Вторая строка начинается с YPos 100 (на 10 точек ниже 90-точечной первой линии) по левому краю. Все, что я вижу, - это вышеупомянутая буква "Р", которая кажется нужного размера.

Третья строка - это штрих-код по центру YPos (120); печатает нормально

Четвертая / последняя строка - это штрих-код в виде текста под самим штрих-кодом, по центру; печатает нормально.

ПРИМЕЧАНИЕ: я пока не могу назначить награду за это, но любой, кто ее решит, получит 100 баллов, как только смогу (думаю, через два дня).

1 ответ

Решение

Оказывается, проблема была в том, что я использовал шрифт № 2, чтобы получить размер шрифта 12 (это единственный шрифт, который обеспечивает такой размер). Проблема со шрифтом № 2 заключается в том, что он является "OCR-A" и поэтому печатает только определенные символы. В строке, которую я проходил в качестве теста ("Жизнь Пи", согласно прайс-листу 3.14), единственный символ, который он распознает в этой строке, - это P. Так вот почему это единственный, который я видел.

Мне пришлось увеличить размер шрифта до следующего доступного, а именно 24, используя шрифт № 5 (Манхэттен) или 7 (Уорик).

"mk" от zebra предоставил мне эту информацию ("Шрифт OCR - это специальный шрифт, который включает не все символы, которые вы пытаетесь напечатать".).

Если вы посмотрите приложение D в руководстве по программированию на CPCL, оно показывает шрифт № 2 как "OCR-A", но меня не осенило, что это означает, что его набор символов исключает большинство буквенных символов. Даже если это очевидно для некоторых, мне кажется, что следует подчеркнуть в руководстве: при печати текста не используйте шрифт № 2!

Примечание. Для текста также следует избегать шрифта № 6 (MICR).

Другие вопросы по тегам