Я работаю над веб-приложением .net
c#
, где мне нужно печатать на принтере Zebra (TTP2030
) текст и штрих-коды. Используя класс RawPrinterHelper
здесь. Я в значительной степени получил команды для принтера в виде строки юникода.
Итак, чтобы напечатать штрих-код, я делаю:
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>
Чего я не знаю, так это правильно ли я отправляю такие вещи, как ‹ h 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
, полученного с веб-сайта zebra.
(Я решил отправить файл вместо подхода SendStringToPrinter
, описанного выше, потому что, ну, я не верю, что поступаю правильно, а также я протестировал отправку файла команд на принтер с несколькими разными командами, и это работал).
Затем вызывается ReadPrinter(hPrinter, sb, 6, out dwWritten);
, но sb
пусто. Метод возвращает 0. Кто-нибудь знает, как я могу прочитать данные с принтера? Есть ли совершенно другой подход, который мне следует рассмотреть для печати (текста и штрих-кодов) и получения состояния принтера?