2011-01-12 4 views
4

У меня есть этот код для печати с Зебра принтера (RW 420, чтобы быть конкретным)Как печатать с кодовой страницей win-1250 на принтере зебры?

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, которые я получил от here.

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

za  g l ja 

Non-ASCII символы отсутствуют.

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

+0

Это звучит как проблема с кодировкой. Вы пробовали конвертировать в другую кодировку, например UTF-8 или ISO-8859-1? –

+0

Отсутствующие символы - это лаковые символы из кодировок win-1250 или iso-8859-2, и я пробовал оба метода Encoding.Convert ... –

+0

Не могли бы вы устранить проблему? Та же проблема здесь. – Mori

ответ

6

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

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

+0

в соответствии с командой epl ручной команды I8, B, 048 должен установить кодовую страницу для победы-1250, и она не имеет никакого эффекта. Я поговорю с продавцом об этом, но я как бы надеялся, что у какого-то другого неанглийского разработчика сглаживания была такая же проблема, и он рассматривал это как-то:) –

+0

кстати. Я иногда завидую англоговорящим разработчикам;) моя жизнь была бы намного проще без всякого кодового костяка;) –

1

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

2

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

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

чешский символы вроде как ěščřžýáíé теперь OK

0

Я добавил вспомогательный метод для моего класса, который преобразует строку (которая по умолчанию 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; 
}