更接近绕过Flex打印对话?

时间:2011-06-21 13:34:32

标签: flex printing air zpl

我知道这是一个非常繁重的主题,并且一直看到它的请求(我相信阻止它的立场与安全相关)。

在试图让ZPL打印在AIR中工作时,我遇到了一些有趣的事情。

看看其他编程语言及其打印到ZPL的尝试,他们中的大多数通过文件流处理它并将打印机视为文件(请参阅此处获取.NET示例.NET code to send ZPL to Zebra printers)。

我用Flex采用了这种方法并获得了一些有趣的结果。

我在我自己的电脑上直接与网络共享打印机进行了测试。这是一段简单的代码:

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 = new File('\\ PC-Name \ Printer-Name');),当您检查文件变量时,您会注意到一些问题。 creationDate,modificationDate和size都有“getter异常抛出”错误。更具体地说“错误:错误#3003:文件或目录不存在。”。我并不过分关注这些,因为它不是文件,而是打印机。

打开流(stream.open(file,FileMode.WRITE);)并检查流变量后,“bytesAvailable”有一个“getter抛出的异常”(错误:错误#2029:此URLStream对象没有一条小溪打开了)。再一次,它不是一个文件所以像这样的bytesAvailable可能是好的(或者它可能是之后所有事情似乎都失败的原因)。此时,您还将在打印队列中打印一个状态为“假脱机”的打印文档。

调用stream.writeBytes(byteArray,0,byteArray.length);导致流变量位置从0移动到167(我的byteArray的长度)。所以它似乎认为它试图写。似乎没有什么“坏”发生在这里......

调用stream.close();然而,整个事情崩溃了“错误#2038:文件I / O错误。在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并共享的打印机)。到目前为止,我没有运气。但是,如果您严格处理网络打印机,这可能会让您跳过/绕过弹性打印对话框。

1 个答案:

答案 0 :(得分:0)

我做了一些假设:如果您正在使用AIR并且您有一个有效的.Net解决方案,并且您只针对Windows ...为什么不使用.Net解决方案并使用{{1}调用它} class?

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

这样你仍然可以拥有一个漂亮的Flexy界面,但获得原生的打印控件。