Apache flex 更接近绕过Flex打印对话?

Apache flex 更接近绕过Flex打印对话?,apache-flex,printing,air,zpl,Apache Flex,Printing,Air,Zpl,我知道这是一个非常沉重的话题,并且一直都有人请求它(我相信阻止它的立场与安全相关) 在尝试让ZPL打印在空中工作时,我遇到了一些有趣的事情 看看其他编程语言和它们打印到ZPL的尝试,它们中的大多数都是通过文件流处理它,并将打印机视为文件(参见此处的.NET示例) 我用Flex采用了这种方法,得到了一些有趣的结果 我在自己的电脑上直接与网络共享打印机进行了测试。这是一段简单的代码: var file:File = new File('\\\\PC-Name\\Printer-Name'); var

我知道这是一个非常沉重的话题,并且一直都有人请求它(我相信阻止它的立场与安全相关)

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

看看其他编程语言和它们打印到ZPL的尝试,它们中的大多数都是通过文件流处理它,并将打印机视为文件(参见此处的.NET示例)

我用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);)并检查流变量后,“bytesavable”有一个“getter引发的异常”(错误:Error#2029:此URLStream对象没有打开流)。再一次,它不是一个文件,所以像这样可用的字节可能没问题(或者这可能是这之后的一切似乎都失败的原因)。此时,您的打印队列中还有一个状态为“假脱机”的打印文档

调用stream.writeBytes(byteArray,0,byteArray.length);使流变量位置从0移动到167(my byteArray的长度)。所以它似乎认为它试图写作。这里似乎没有什么“不好”的事情发生

调用stream.close();但是,由于“Error#2038:File I/O Error.at flash.filesystem::FileStream/close()错误”,整个过程崩溃了

将此贴在这里,看看是否有人有任何想法(我遗漏了什么吗?完全不可能吗?接近但没有雪茄?)

********更新*********

我确实找到了一种通过网络打印机(不幸的是,不是windows共享打印机)实现这一点的方法。它使用套接字而不是文件流。我几乎可以向您保证,这将在实际发布时引发一些沙盒冲突,因此需要处理这些冲突(我假设是套接字策略文件)


不确定是否可以通过插座连接到windows共享打印机(即连接到个人电脑并共享的打印机).到目前为止,我还没有任何运气。但是,如果你严格地与网络打印机打交道,这可能会让你跳过/绕过flex print对话。

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

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


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

这可能是所有这些问题的最终答案。如果我们可以将所有这些捆绑在一个应用程序和一个代码库中,肯定会更为可取。我知道很多人也在寻找避免Fle中的打印机对话的方法x/Air。如果这确实是一个失败的练习,我们将转到调用.net代码段的NativeProcess。它看起来非常有希望,因为似乎可以通过这种方式启动对打印机的假脱机;)您可以将其捆绑在一起,只需将EXE放在“资源”中即可“文件夹,并以这种方式使用它。当您部署应用程序时,它将与应用程序打包。这正是Rosetta Stone的工作原理(Rosetta Stone是一款Flex/AIR应用程序)。唯一的附加依赖项是.Net,但大多数windows计算机都有。我对Flex的文件流或打印了解不够,无法帮助您抱歉:(“我对Flex的文件流或打印了解不够,无法帮助您抱歉:()没问题,我非常感谢您在您提供的解决方案中提供的帮助。这可能是我最终选择的路线,因为虽然我现在已经成功地使用套接字与网络打印机通信,但我也需要它来处理共享打印机,而这种方式似乎不可能。上面添加的更新已成功与网络打印机的套接字连接(仍无法处理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");
}