Ближе к обходу диалога печати Flex? - PullRequest
0 голосов
/ 21 июня 2011

Я знаю, что это довольно тяжелая тема, и постоянно вижу запросы на нее (я думаю, что позиция по ее блокированию связана с безопасностью).

Пока возится, пытаясь заставить работать печать 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);

Очевидно, что вам нужно будет ввести свои собственные данные для имени ПК (имя сети) и имени принтера (общее имя принтера).

Если вы посмотрите на ваш принтер, вы заметите, что он запускает подкачку с этим запросом.

К сожалению, это почти то, что я могу сделать с ним.Инициирование какого-либо фактического написания этого потока, похоже, не работает (хотя я далеко не эксперт в этом вопросе, я мог бы что-то упустить).

Переходя через что-то вроде:

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, modifyDate и size имеют ошибки «исключение выдается получателем».В частности, «Ошибка: ошибка № 3003: файл или каталог не существует».Я не слишком обеспокоен этим, поскольку это не файл, а принтер.

После открытия потока (stream.open (file, FileMode.WRITE);) и проверки переменной потока ""bytesAvailable "имеет" исключение, выданное получателем "(ошибка: ошибка # 2029: у этого объекта URLStream нет открытого потока).Еще раз, это не файл, так что bytesAvailable вроде этого может быть в порядке (или это может быть причиной того, что все после этого, похоже, перестало работать).На этом этапе у вас также будет печатный документ со статусом «Буферизация» в очереди печати. ​​

Вызов stream.writeBytes (byteArray, 0, byteArray.length);заставляет позицию переменной потока перемещаться от 0 до 167 (длина моего byteArray).Так что, кажется, он пытается писать.Кажется, ничего «плохого» здесь не происходит .....

Вызов stream.close ();однако все это приводит к сбою с сообщением об ошибке «Ошибка № 2038: ошибка ввода-вывода файла. 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 (то есть к принтеру, подключенному к чьему-то компьютеру и совместно используемому). До сих пор у меня не былоНе повезло. Но если вы строго имеете дело с сетевыми принтерами, это может помочь вам пропустить / пропустить диалог гибкой печати. ​​

1 Ответ

0 голосов
/ 21 июня 2011

Я делаю несколько предположений: если вы используете AIR и у вас есть работающее решение .Net и вы ориентируетесь только на Windows ... почему бы просто не использовать решение .Net и вызывать его, используя класс NativeProcess?

По сути, вы компилируете принтер ZPL .NET в виде EXE и вызываете его с помощью NativeProcess, передавая строку принтера.

Таким образом, вы можете по-прежнему иметь хороший интерфейс Flexy, но получить собственные элементы управления печатью.

...