Как распечатать кодовую страницу win-1250 на принтере Zebra - PullRequest
4 голосов
/ 12 января 2011

У меня есть этот код для печати на принтере Zebra (RW 420, в частности)

StringBuilder sb = new StringBuilder();            
sb.AppendLine("N");            
sb.AppendLine("q609");
sb.AppendLine("Q203,26");
//set printer character set to win-1250
sb.AppendLine("I8,B,001");
sb.AppendLine("A50,50,0,2,1,1,N,\"zażółć gęślą jaźń\"");
sb.AppendLine("P1");

printDialog1.PrinterSettings = new System.Drawing.Printing.PrinterSettings();
if (printDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    byte[] bytes = Encoding.Unicode.GetBytes(sw.ToString());
    bytes = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(1250), bytes);                
    int bCount = bytes.Length;
    IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(bCount);
    System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, bytes.Length);
    Common.RawPrinterHelper.SendBytesToPrinter(printDialog1.PrinterSettings.PrinterName, ptr, bCount);
}

RawPrinterHelper - это класс от Microsoft, полученный от здесь .

Моя проблема в том, что только символы ASCII печатаются следующим образом:

za     g  l  ja  

Отсутствуют символы, не входящие в ASCII.

Забавно, что когда я открываю Блокнот и помещаю тот же тексттам и распечатать его на принтере Zebra все символы в порядке.

Ответы [ 4 ]

6 голосов
/ 12 января 2011

Разница в том, что Блокнот использует драйвер принтера, вы его обходите. Принтеры Zebra имеют некоторую поддержку для использования встроенных шрифтов. У него есть наборы символов для кодовой страницы 950 и что-то, что называется «Latin 1» и «Latin 9». Ключевая проблема заключается в том, что ни один из них не содержит необходимых вам глифов. Драйвер принтера решает эту проблему, отправляя на принтер графику, а не строки. Руководство по программированию здесь кстати.

Я бы предположил, что на этих принтерах есть какая-то опция для установки дополнительных шрифтов, которые трудно реализовать в остальном мире, если бы это было не так. Обратитесь к вашему дружественному поставщику принтеров за поддержкой и опциями.

2 голосов
/ 01 июля 2015

В Wireshark я обнаружил, что кодировка от ZebraDesigner - это UTF-8, поэтому попробуйте преобразовать строку в байт [] как utf-8

byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sw.ToString());

чешские буквы, как и сейчас, в порядке

1 голос
/ 21 февраля 2011

Если вам нужно добавить пользовательские символы на ваш принтер, взгляните на патч , который я сделал для SharpZebra. Это должно быть тривиально изменить, чтобы добавить поддержку этих пропущенных букв.

0 голосов
/ 21 марта 2017

Я добавил в свой класс вспомогательный метод, который преобразует строку (которая по умолчанию UTF-16) в UTF-8 в кодировке byte[], а затем печатает ее.

public static bool SendUtf8StringToPrinter(string szPrinterName, string szString)
{   
    // by default System.String is UTF-16 / Unicode
    byte[] bytes = Encoding.Unicode.GetBytes(szString);

    // convert this to UTF-8. This is a lossy conversion and you might lose some chars
    bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytes);
    int bCount = bytes.Length;

    // allocate some unmanaged memory
    IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(bCount);

    // copy the byte[] into the memory pointer
    System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, bCount);

    // Send the converted byte[] to the printer.
    SendBytesToPrinter(szPrinterName, ptr, bCount);

    // free the unmanaged memory
    System.Runtime.InteropServices.Marshal.FreeCoTaskMem(ptr);

    // it worked! Happy cry.
    return true;
}
...