4

以下の手順を使用して、EPSON TM-T88IV サーマル プリンターの .net 経由で印刷しました。

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();
        }
    }
4

1 に答える 1