0

我知道这是一个相当沉重的话题,并且一直看到对此的请求(我相信阻止它的立场与安全相关)。

在尝试让 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 并共享的打印机)。到目前为止,我还没有运气。但是,如果您严格处理联网打印机,这可能对您跳过/绕过柔性打印对话有用。

4

1 回答 1

0

我在做一些假设:如果您使用的是 AIR,并且您有一个有效的 .Net 解决方案并且您只针对 Windows……为什么不直接使用 .Net 解决方案并使用NativeProcess类来调用它?

基本上,您将 ZPL .NET 打印机编译为 EXE,并使用 NativeProcess 调用它,并传入打印机字符串。

这样,您仍然可以拥有一个不错的 Flexy 界面,但可以获得本机打印控件。

于 2011-06-21T14:13:25.597 回答