接近绕过Flex打印对话框



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

在试图让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界面,但可以获得本地打印控制。

相关内容

  • 没有找到相关文章

最新更新