Почему текстовое значение штрих-кода не печатается под штрих-кодом?
Я печатаю, используя 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).