在EPSON TM-T88IV热敏打印机中打印UTF-8编码文本

时间:2014-02-18 07:19:16

标签: c# .net encoding thermal-printer epson

我已使用以下说明通过.net打印EPSON TM-T88IV热敏打印机。

http://nicholas.piasecki.name/blog/2009/12/sending-a-bit-image-to-an-epson-tm-t88iii-receipt-printer-using-c-and-escpos/

我正在使用下面的代码,我已将编码更改为UTF-8但仍无法打印Unicode 打印一些垃圾字符。

private void frmMain_Load(object sender, EventArgs e)
    {
        Print(PrinterName, GetDocument());
    }

    private const string PrinterName = "EPSON TM-T88IV ReceiptE4";

    private static byte[] GetDocument()
    {
        UTF8Encoding utf8 = new UTF8Encoding();
        using (var ms = new MemoryStream())
        using (var bw = new BinaryWriter(ms,Encoding.UTF8))
        {
            // Reset the printer bws (NV images are not cleared)
            bw.Write(AsciiControlChars.Escape);
            bw.Write("سلام دنیا");
            bw.Write(AsciiControlChars.Newline);
            // Feed 3 vertical motion units and cut the paper with a 1 point cut
            bw.Write(AsciiControlChars.GroupSeparator);
            bw.Write('V');
            bw.Write((byte)66);
            bw.Write((byte)3);

            bw.Flush();

            return ms.ToArray();
        }
    }

    private static void Print(string printerName, byte[] document)
    {
        NativeMethods.DOC_INFO_1 documentInfo;
        IntPtr printerHandle;

        documentInfo = new NativeMethods.DOC_INFO_1();
        documentInfo.pDataType = "RAW";
        documentInfo.pDocName = "Bit Image Test";

        printerHandle = new IntPtr(0);

        if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero))
        {
            if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo))
            {
                int bytesWritten;
                byte[] managedData;
                IntPtr unmanagedData;

                managedData = document;
                unmanagedData = Marshal.AllocCoTaskMem(managedData.Length);
                Marshal.Copy(managedData, 0, unmanagedData, managedData.Length);

                if (NativeMethods.StartPagePrinter(printerHandle))
                {
                    NativeMethods.WritePrinter(
                        printerHandle,
                        unmanagedData,
                        managedData.Length,
                        out bytesWritten);
                    NativeMethods.EndPagePrinter(printerHandle);
                }
                else
                {
                    throw new Win32Exception();
                }

                Marshal.FreeCoTaskMem(unmanagedData);

                NativeMethods.EndDocPrinter(printerHandle);
            }
            else
            {
                throw new Win32Exception();
            }

            NativeMethods.ClosePrinter(printerHandle);
        }
        else
        {
            throw new Win32Exception();
        }
    }

0 个答案:

没有答案
相关问题