Domanda

sto cercando di stampare pagina di codice esteso 850 caratteri utilizzando ZPL II a uno Zebra S4M. Ogni volta che uno dei caratteri estesi vale a dire valore ASCII> 127 viene utilizzato ottengo una scatola di varie tonalità di grigio invece del valore reale.

sto cercando di stampare ± e ° (ALT + 0177 e ALT + 0176). Ho il sospetto che la sua l'RawPrinterHelper che sto cercando di utilizzare (come scaricato da MS, e un altro da CodeProject), tuttavia non posso vedere dove i codici di carattere stanno andando male.

Stranamente, stampa diretta da Blocco note rende i caratteri corretti, che mi porta a credere che sia un problema con la classe di supporto di stampa crudo.

Io non sono legato ad utilizzare la classe Raw stampante Helper quindi se c'è un modo migliore di farlo, io sono più che felice di vederli.

CAMPIONE ZPLII Senza caratteri escape

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

Con caratteri escape (provato sia maiuscole e minuscole)

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

Raw stampante Helper

[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);
    }
}

Fix reale dalla risposta accettata il set di caratteri Internazionalizzazione (codice ^ CI27 ) per Code Page 1252.

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

Soluzione

Sì, le caselle ombreggiate hanno i codici di byte, in codice della pagina 1252. Il che senza dubbio è la pagina di codice predefinito per la stampante, 1252 è la pagina di codice di Windows per l'Europa occidentale e le Americhe.

Si dovrà inviare un comando per cambiare la pagina di codice a 850. A giudicare da la manuale, che richiede ^ CI per selezionare il set di caratteri 13.

Mantenere la pagina di codice a 1252 e cambiare i codici di carattere invece sarebbe saggio. Le tabelle dei glifi sono nella parte posteriore del manuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top