我知道这是一个非常沉重的主题,并且总是看到对它的请求(我认为阻止它的立场与安全相关)。
在试图让ZPL打印在AIR中工作时,我遇到了一些有趣的事情。
看看其他编程语言及其打印到ZPL的尝试,它们中的大多数都是通过文件流处理的,并将打印机视为一个文件(请参阅此处的.NET示例.NET代码,将ZPL发送到Zebra打印机)。
我在Flex中采用了这种方法,并得到了一些有趣的结果。
我在自己的电脑上直接与网络共享打印机进行了测试。这是一段简单的代码:
var file:File = new File('\\PC-Name\Printer-Name');
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
显然,您需要填写您自己的PC名称(网络名称)和打印机名称(打印机共享名称)信息。
如果你观察你的打印机,你会注意到它确实通过这个请求启动了后台打印。
不幸的是,这是我所能做到的。开始任何形式的实际写作似乎都不起作用(尽管我还不是这方面的专家,但我可能会错过一些东西)。
通过类似的步骤:
var file:File = new File('\\PC-Name\Printer-Name');
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.close();
你可以看到它在打开的情况下击中后台处理程序,然后成功关闭,没有任何不良影响。
一旦你添加了一个实际的写入,例如:
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTFBytes("Hello World");
byteArray.position = 0;
var file:File = new File('\\PC-Name\Printer-Name');
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeBytes(byteArray, 0, byteArray.length);
stream.close();
不幸的是,一切都见鬼去了。
关于变量和发生的事情需要注意:
在声明您的文件(var file:file=new file('\\PC Name\Printer Name');)之后,当您检查文件变量时,您会注意到一些问题。creationDate、modificationDate和size都有"getter抛出的异常"错误。更具体地说,"错误:错误#3003:文件或目录不存在。"。我不太关心这些,因为它不是文件,而是打印机。
打开流后(stream.open(file,FileMode.WRITE);)并且检查流变量"bytesAvailable"有一个"getter抛出的异常"(错误:错误#2029:此URLStream对象没有打开流)。再说一次,它不是一个文件,所以像这样可用的字节可能还可以(或者这可能是之后一切似乎都失败的原因)。此时,您的打印队列中还会有一个状态为"后台打印"的打印文档。
调用stream.writeBytes(byteArray,0,byteArray.length);导致流变量位置从0移动到167(字节数组的长度)。所以它似乎认为它试图写作。这里似乎没有发生什么"坏事"。。。。。
调用stream.close();然而,这会导致整个事件崩溃,并显示"错误#2038:文件I/O错误.atflash.filesystem::FileStream/close()
在这里发布这个,看看是否有人有任何想法(我错过了什么吗?这完全不可能吗?关闭但没有雪茄?)
********更新*********
我确实找到了一种使用网络打印机实现这一点的方法(不幸的是,没有使用windows共享打印机)。它使用的是套接字而不是文件流。我几乎可以向你保证,这将在实际发布时引发一些沙盒冲突,因此需要处理(我认为是套接字策略文件)。
public var socket:Socket = new Socket();
socket.addEventListener( Event.CONNECT, onConnect);
socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData);
socket.connect(ip_address, 9100);
private function onConnect(event : Event) : void {
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTFBytes("Hello World");
byteArray.position = 0;
socket.writeBytes(byteArray, 0, byteArray.length);
socket.removeEventListener(Event.CONNECT, onConnect);
socket.removeEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
socket.flush();
socket.close();
}
public function onSocketData(event:Event):void {
trace("onSocketData Fired");
}
不确定是否可以通过插座连接到windows共享打印机(即连接到某人电脑并共享的打印机)。到目前为止,我没有任何运气。但是,如果你严格使用网络打印机,这可能会让你跳过/绕过柔性打印对话框。
我做了一些假设:如果你使用AIR,并且你有一个有效的.Net解决方案,并且你只针对Windows。。。为什么不直接使用.Net解决方案并使用NativeProcess
类进行调用呢?
基本上,您将ZPL.NET打印机编译为EXE,并使用NativeProcess调用它,传入打印机字符串。
这样你仍然可以有一个很好的Flexy界面,但可以获得本地打印控制。