Я знаю, что это довольно тяжелая тема, и постоянно вижу запросы на нее (я думаю, что позиция по ее блокированию связана с безопасностью).
Пока возится, пытаясь заставить работать печать 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 (то есть к принтеру, подключенному к чьему-то компьютеру и совместно используемому). До сих пор у меня не былоНе повезло. Но если вы строго имеете дело с сетевыми принтерами, это может помочь вам пропустить / пропустить диалог гибкой печати.