Я нахожусь на веб-приложении .net
c#
, где мне нужно распечатать на принтере zebra (TTP2030
) текст и штрих-коды. Использование класса RawPrinterHelper
from here. Я в значительной степени получил команды на принтер, как строку в Юникоде.Отправка необработанных данных на принтер Zebra TTP 2030 и получение его статуса
Таким образом, для печати штрих-кода я:
string enq = Convert.ToChar(5).ToString();
string esc = Convert.ToChar(27).ToString();
string nul = Convert.ToChar(0).ToString();
string rs = Convert.ToChar(30).ToString();
string lf = Convert.ToChar(10).ToString();
string cr = Convert.ToChar(13).ToString();
StringBuilder sb = new StringBuilder();
sb.Append(esc + "BS" + nul + nul + Convert.ToChar(72).ToString() + nul + nul);
sb.Append(nul + nul + Convert.ToChar(64).ToString() + nul + Convert.ToChar(2).ToString() + Convert.ToChar(2).ToString());
sb.Append(esc + "BW" + nul + "733104000099" + nul);
sb.Append(lf + rs);
RawPrinterHelper.SendStringToPrinter(printerName, sb.ToString());
Мнемоника для этой команды является
< ESC>BS<0><0>< h 48><0><0>
<00><0>< h 40><0><2><2>
< ESC>BW<00>733104000099<00>
< LF>< RS>
То, что я не знаю, если я правильно посылать вещи, как < ч 48>. Из руководства ведущий h
, за которым следует пробел, указывает шестнадцатеричное значение. В этом случае это значение представляет координату X
(младший байт - я не знаю, что это такое) штрих-кода.
Если это значение находится в пикселях (или мм), как преобразовать в шестнадцатеричный, а затем в Юникод, который я отправляю на принтер?
Также, Как преобразовать десятичные значения, которые необходимо отправить?
Например, для печати линейки линии Посылаю:
< ESC>r<0><0><0><0><1><230><0><24><3>
Все десятичные значения, то есть положение, старт, стоп и т.д.
Как преобразовать эту команду, так что я могу отправить на принтер?
Еще одна вещь, с которой я не могу работать, - это получение данных с принтера. Есть несколько команд, доступных, как получить статус бумаги, серийный номер, прошивку и т.д. Чтобы попытаться достичь этого первого я добавил
[DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int ReadPrinter(IntPtr hPrinter, StringBuilder data, int buf, out int pcRead);
в RawPrinterHelper
классе. Затем я попытался отправить команду, используя SendFileToPrinter
и файл .prn
я сохранил от небольшого приложения под названием kiosk printer toolbox
меня с сайта зебры
(я решил отправить файл вместо SendStringToPrinter
подхода я описал выше, потому что, ну, Я не верю, что делаю там правильные вещи, а также проверял отправку файла команд на принтер с несколькими различными командами, и он работал).
Затем называется ReadPrinter(hPrinter, sb, 6, out dwWritten);
, но sb
пуст. Метод возвращает 0. Кто-нибудь знает, как я могу читать данные с принтера? Есть ли совершенно другой подход, который я должен рассматривать для печати (текст и штрих-коды) и получение статуса принтера?
Как обновление об этом, я отбросил winspool.drv в пользу чтения и записи непосредственно на USB-порт, используя LibUsbDotNet. С winspool я не мог получить никаких данных с принтера, с ReadPrinter или GetPrinterData (скорее всего, я не знаю, как их использовать, я не мог найти ничего полезного в этом вопросе). LibUsbDotNet - отличная библиотека, и я могу легко отправлять команды на принтер (так же, как описано выше), и получать данные от него. Единственная проблема, с которой я столкнулся сейчас, - это преобразование десятичных и шестнадцатеричных значений для команд принтера и преобразование вывода в нечто читаемое. – bfi