如何在zebra打印机上使用win-1250代码页打印?

时间:2011-01-12 14:34:12

标签: c# utf-8 zebra-printers zpl epl

我有使用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是我从here获得的Microsoft课程。

我的问题是只打印ASCII字符:

za     g  l  ja  

缺少非ASCII字符。

有趣的是,当我打开记事本并将相同的文字放在那里并在Zebra打印机上打印时,所有字符都可以。

4 个答案:

答案 0 :(得分:6)

区别在于记事本正在使用打印机驱动程序,您正在绕过它。 Zebra打印机支持使用其内置字体。它有代码页950的字符集和它所谓的“拉丁语1”和“拉丁语9”。关键问题是它们都不包含你需要的字形。打印机驱动程序通过向打印机发送图形而不是字符串来解决此问题。编程手册is here btw。

我认为这些打印机有某种选择来安装其他字体,如果不是这样的话,很难在世界其他地方进行销售。请联系您的友好打印机供应商以获取支持和选项。

答案 1 :(得分:2)

我在Wireshark发现ZebraDesigner的字符集是UTF-8,所以尝试将字符串转换为byte []为utf-8

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

像ěščřžýáíé这样的捷克人现在可以了

答案 2 :(得分:1)

如果您需要在打印机中添加自定义字符,请查看我为SharpZebra制作的patch。修改它以增加对丢失的字母的支持应该是微不足道的。

答案 3 :(得分: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;
}