如何使用Objective-C将ESC / POS发送到收据打印机

时间:2014-03-18 13:39:39

标签: objective-c point-of-sale epson

我想使用ESC / POS在Epson热敏收据打印机上打印收据。

打印机通过USB连接,并且安装了打印机驱动程序。但我不想打印生成的光栅图像。相反,我想将原始的ESC / POS命令发送到打印机。

ESC / POS基本上是纯文本,带有一些转义命令,允许一些额外的格式化,剪纸,甚至打开连接到打印机的现金抽屉。我已经在C#中创建了我的应用程序的Windows版本,并且已经知道如何格式化必须发送到打印机的数据。对于这个问题的所有意图和目的,假设我有一个缓冲区,其中包含需要发送到打印机的有效ESC / POS命令。

C#不允许我直接打开打印机并将原始数据写入其中,因此我基本上从Win32 API中调用了一些函数。

代码如下所示:

    public Boolean Print(string printerName, byte[] document)
    {
        try
        {
            NativeMethods.DOC_INFO_1 documentInfo;
            IntPtr printerHandle;

            documentInfo = new NativeMethods.DOC_INFO_1();
            documentInfo.pDataType = "RAW";
            documentInfo.pDocName = "POS receipt";

            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();
            }
        }
        catch (Exception e)
        {
        }
    }

Print()命令将打印机的名称和字节数组作为参数。目的是打开命名的打印机并将字节数组作为原始数据发送。

我希望有一种解决方案以这种或那种方式使用打印机驱动程序,因为它抽象了打印机的连接方式。我目前用于测试的打印机是使用USB连接的,但也有一些型号具有串行端口,可以使用串口转USB电缆连接。

我的问题: 我如何在Objective-C中执行相应的上述代码?

0 个答案:

没有答案