我想使用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中执行相应的上述代码?