我知道这是一个相当沉重的话题,并且一直看到对此的请求(我相信阻止它的立场与安全相关)。
在尝试让 ZPL 打印在 AIR 中工作时,我遇到了一些有趣的事情。
查看其他编程语言及其打印到 ZPL 的尝试,它们中的大多数通过文件流处理它并将打印机视为文件(请参阅此处以获取将 ZPL 发送到 Zebra 打印机的 .NET 示例 .NET 代码)。
我在 Flex 中采用了这种方法并得到了一些有趣的结果。
我在我自己的 PC 上直接与网络共享打印机进行了测试。这是一段简单的代码:
var file:File = new File('\\\\PC-Name\\Printer-Name');
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
显然,您需要为 PC-Name(网络名称)和 Printer-Name(打印机的共享名称)填写您自己的信息。
如果您观察您的打印机,您会注意到它确实使用此请求启动假脱机。
不幸的是,这是我能做到的。在该流上启动任何类型的实际写入似乎都不起作用(尽管我不是这方面的专家,但我可能会遗漏一些东西)。
逐步执行以下操作:
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 对象没有打开流)。再一次,它不是一个文件,所以像这样的 bytesAvailable 可能没问题(或者这可能是这之后的一切似乎都失败的原因)。此时,您的打印队列中还将有一个状态为“Spooling”的打印文档。
调用 stream.writeBytes(byteArray, 0, byteArray.length); 导致流变量位置从 0 移动到 167(我的 byteArray 的长度)。所以它似乎认为它试图写。这里似乎没有发生任何“坏事”......
调用 stream.close(); 但是,由于“错误 #2038: File I/O Error. at flash.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 共享打印机(即连接到某人的 PC 并共享的打印机)。到目前为止,我还没有运气。但是,如果您严格处理联网打印机,这可能对您跳过/绕过柔性打印对话有用。