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

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

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

C#不允许我直接打开打印机并将原始数据写入其中,因此我基本上P / Invoke 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电缆连接 .

My question: 如何在Objective-C中执行上述代码的等效操作?