我想使用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中执行上述代码的等效操作?