2010-04-21 53 views
3

我试图使用ZPL II打印扩展代码页850个字符到Zebra S4M。每当其中一个扩展字符I.E.使用ASCII值> 127我得到一盒不同的灰色阴影,而不是实际值。ZPL II扩展字符

我在打印±和°(ALT + 0177和ALT + 0176)。我怀疑它正在尝试使用的RawPrinterHelper(从MS下载,另一个来自CodeProject),但是我无法看到字符代码出错的地方。

奇怪的是,从记事本直接打印呈现正确的字符,这导致我相信它是原始打印机助手类的问题。

我并不打算使用Raw Printer Helper类,所以如果有更好的方法,我很乐意看到它们。

样品ZPLII 没有逃脱字符

^XA 
^FO30,200^AD^FH,18,10^FD35 ± 2 ° ^FS 
^FS 
^XZ 

随着转义字符(尝试都大写和小写)

^XA 
^FO30,200^AD^FH,18,10^FD35 _b0 2 _b1 ^FS 
^FS 
^XZ 

原始打印机助手

[StructLayout(LayoutKind.Sequential)] 
public struct DOCINFO 
{ 
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string printerDocumentName; 
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pOutputFile; 
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string printerDocumentDataType; 
} 

public class RawPrinter 
{ 
    [ 
     DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault); 

    [ 
     DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo); 

    [ 
     DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long StartPagePrinter(IntPtr hPrinter); 

    [ 
     DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten); 

    [ 
     DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long EndPagePrinter(IntPtr hPrinter); 

    [ 
     DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long EndDocPrinter(IntPtr hPrinter); 

    [ 
     DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, 
      CallingConvention = CallingConvention.StdCall)] 
    public static extern long ClosePrinter(IntPtr hPrinter); 

    public static void SendToPrinter(string printerJobName, string rawStringToSendToThePrinter, 
            string printerNameAsDescribedByPrintManager) 
    { 
     IntPtr handleForTheOpenPrinter = new IntPtr(); 
     DOCINFO documentInformation = new DOCINFO(); 
     int printerBytesWritten = 0; 
     documentInformation.printerDocumentName = printerJobName; 
     documentInformation.printerDocumentDataType = "RAW"; 
     OpenPrinter(printerNameAsDescribedByPrintManager, ref handleForTheOpenPrinter, 0); 
     StartDocPrinter(handleForTheOpenPrinter, 1, ref documentInformation); 
     StartPagePrinter(handleForTheOpenPrinter); 
     WritePrinter(handleForTheOpenPrinter, rawStringToSendToThePrinter, rawStringToSendToThePrinter.Length, 
        ref printerBytesWritten); 
     EndPagePrinter(handleForTheOpenPrinter); 
     EndDocPrinter(handleForTheOpenPrinter); 
     ClosePrinter(handleForTheOpenPrinter); 
    } 
} 

从接受的答案实际修复的字符集国际(代码^CI27)到代码页1252

^XA 
^FO30,200^AD^CI27^FH,18,10^FD35 _b0 2 _b1 ^FS 
^FS 
^XZ 

回答

5

是的,阴影框有那些字节代码,在代码页1252哪些无疑是打印机的默认代码页,1252是西欧和美洲的Windows代码页。

你必须发送一个命令代码页转换到850从the manual来看,需要^ CI选择字符集13

在1252保持的代码页和改变你的字符代码将是明智的。字形表位于手册的后面。

+0

感谢汉斯 - 我会在早上去一趟,看看能否解决问题 – Mauro 2010-04-21 18:05:15