Павел Гольцев
unread,Dec 30, 2009, 4:25:05 AM12/30/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to ruf...@googlegroups.com
Всем привет!
Кто-нибудь может посоветовать, как быть, когда нужно распечатать очень много страниц высокого разрешения за раз, при этом загружая их по очереди, а не все сразу. Проблема в том, что PrintJob.addPage необходимо вызывать сразу друг за другом в одном месте. Если же я вызываю addPage один раз, потом пытаюсь загрзить другую картинку, вызываю addPage второй, раз, то второй раз вылезает ошибка. Другими словами, если между соседними вызовами addPage существуют какие-то задержки, либо выполняется какой-то код, требующий отложенных действий, то следующие вызовы addPage уже не работают.
Пример
// рабочий код
import flash.display.Sprite;
import flash.printing.PrintJob;
var _print_job:PrintJob = new PrintJob();
var print_sprite:Sprite = new Sprite();
print_sprite.addChild(new Page());
if (_print_job.start()) {
try {
_print_job.addPage(print_sprite);
} catch (e:Error) {
trace("Ошибка при печати: " + e.message);
return;
}
_print_job.send();
}
// нерабочий код
public class PrintController extends EventDispatcher {
protected var _print_job:PrintJob;
protected var _ldr:Loader;
protected var _load_ind:uint;
protected var _url_list:XMLList;
protected var _print_started:Boolean;
public function PrintController(url_list:XMLList) {
super();
_url_list = url_list;
_ldr = new Loader();
_ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler, false, 0, true);
_ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadIOErrorHandler, false, 0, true);
}
public function printPages():void {
_load_ind = 0;
_print_job = new PrintJob();
_print_started = false;
loadPage();
}
public function cancelPrint():void {
_ldr.unload();
dispatchEvent(new PrintControllerEvent(PrintControllerEvent.PRINT_CANCEL));
}
public function get print_ind():uint {
return _load_ind - 1;
}
protected function loadPage():void {
if (_load_ind >= _url_list.length()) {
_print_job.send();
trace("Стартуем печать!!!");
dispatchEvent(new PrintControllerEvent(PrintControllerEvent.PRINT_COMPLETE));
} else {
_ldr.unload();
_ldr.load(new URLRequest(_url_list[_load_ind].toString()));
trace("ЗАГРУЖАЕМ " + _load_ind+" "+_url_list[_load_ind].toString());
_load_ind++;
}
}
protected function printPage():void {
var print_sprite:Sprite = new Sprite();
print_sprite.addChild(_ldr.content);
if (!_print_started) _print_started = _print_job.start();
if (_print_started) {
try {
_print_job.addPage(print_sprite);
} catch (e:Error) {
trace("Ошибка при печати: " + e.message);
return;
}
}
}
protected function loadCompleteHandler(e:Event):void {
trace("завершена")
printPage();
loadPage();
}
protected function loadIOErrorHandler(e:IOErrorEvent):void {
TraceMgr.out("Ошибка загрузки страницы при печати по адресу " + _url_list[print_ind]);
loadPage();
}
}
В последнем случае вызывается для начала печати вызывается функция printPages объекта класса PrintController. В нем загружается по очереди каждая страница, добавляется методом addPage в стэк печати, а когда все страницы загружены, запускается PrintJob.send. Так вот второй вызов addPage вызывает ошибку, а первый срабатывает корректно, и на печать выходит только 1 страница.