0

これは非常に重いトピックであることは承知しており、常にリクエストが寄せられています (これをブロックするスタンスはセキュリティに関連していると思います)。

ZPL 印刷を AIR で動作させようとしていじっていたときに、興味深いことに遭遇しました。

他のプログラミング言語と ZPL への印刷の試みを見ると、それらのほとんどはファイル ストリームを介して処理し、プリンターをファイルとして扱います ( ZPL を Zebra プリンターに送信する .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 は問題ない可能性があります (または、これ以降のすべてが失敗したように見える理由である可能性があります)。この時点で、印刷キューに「スプーリング」ステータスの印刷ドキュメントもあります。

stream.writeBytes(byteArray, 0, byteArray.length); の呼び出し ストリーム変数の位置を 0 から 167 (byteArray の長さ) に移動させます。だから、書き込もうとしているようです。ここでは「悪い」ことは何も起こらないようです.....

stream.close(); の呼び出し ただし、「Error #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 に答える