4

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

4 に答える 4

6

違いは、メモ帳がプリンター ドライバーを使用しており、それをバイパスしていることです。Zebra プリンタは、組み込みフォントの使用をある程度サポートしています。コードページ 950 の文字セットと、"Latin 1" および "Latin 9" と呼ばれるものがあります。重要な問題は、必要なグリフが含まれていないことです。プリンタ ドライバは、文字列ではなくグラフィックスをプリンタに送信することで、この問題を解決します。プログラミングマニュアルはここにあります

これらのプリンターには、追加のフォントをインストールするための何らかのオプションがあり、そうでない場合、世界中で販売するのは難しいと思います. サポートとオプションについては、親切なプリンター ベンダーにお問い合わせください。

于 2011-01-12T16:16:59.317 に答える
1

プリンターにカスタム文字を追加する必要がある場合は、私が作成した SharpZebra 用のパッチをご覧ください。欠落している文字のサポートを追加するように変更するのは簡単です。

于 2011-02-21T17:28:18.553 に答える
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;
}
于 2017-03-21T07:54:40.257 に答える