[ruFlash] Печать сразу нескольких страниц с высоким разрешением

0 views
Skip to first unread message

Павел Гольцев

unread,
Dec 30, 2009, 4:25:05 AM12/30/09
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 страница.

Павел Гольцев

unread,
Dec 30, 2009, 4:28:52 AM12/30/09
to ruf...@googlegroups.com
По первому рабочему примеру кода я показал не совсем то, что хотел. Вот более объемный пример. В данном случае на печать отправляется 2 картинки сразу, и так это работает.

Flop Serg

unread,
Dec 30, 2009, 4:49:21 AM12/30/09
to ruflash
после задержки
создай новый принтДжоб и ему сделай аддПэйдж

Павел Гольцев

unread,
Dec 30, 2009, 5:49:30 AM12/30/09
to ruf...@googlegroups.com
после задержки
создай новый принтДжоб и ему сделай аддПэйдж

В этом случае повторно вылезает окно настроек. А если там 100 страниц, то пользователю сто раз надо будет выбирать те же самые параметры для печати. Это совсем неприкольно. Мне нужно, чтобы окно настроек вылезало один раз за всю сессию печати. Неужели никто такую задачу не решал?

Роман Гулиев

unread,
Dec 30, 2009, 5:55:33 AM12/30/09
to ruf...@googlegroups.com
Прошу прощения, я работал с печатью во флеше только один раз, да и то
в пьяном угаре, но разве нельзя кэшировать необходимые для печати
страницы, а потом все разом в цикле добавлять через addPage ?
--
Best Regards
Roman 'Obi' Guliev

Павел Гольцев

unread,
Dec 30, 2009, 6:06:29 AM12/30/09
to ruf...@googlegroups.com
Кэшировать можно. Но я уже тут постил проблему, когда при большом количестве больших картинок их последовательная загрузка по непонятным причинам начинает происходить некорректно с какой-то n-ной картинки. То есть параметры картинки, которая приходит в content свойстве загрузчика, являются некорректными, в частности свойства width и height почему-то выставлены в 0. Причем это происходит, если картинки все остаются в памяти одновременно. Если же загружать по одной и затем удалять из памяти до загрузки другой, все естественно работает как нужно. Поэтому в данном случае я вообще опасаюсь какого-либо кэширования внутри флэша, поскольку количество картинок может вообще зашкаливать за 100.

Роман Гулиев

unread,
Dec 30, 2009, 6:11:09 AM12/30/09
to ruf...@googlegroups.com
Ну так и удаляйте лоадер спокойно после загрузки, что вам мешает?
Загрузили картинку засунули битмапдату в массив, снесли лоадер. 100
картинок пусть даже по мегабайту получится 100мб — терпимо.

Yuri Zhloba

unread,
Dec 30, 2009, 7:07:25 AM12/30/09
to ruf...@googlegroups.com
Инфа с мастер-класса от Farata Systems:

Проблема с печатью во флеш плеере заключается в том, что он не мультипоточный. Поэтому обработку печати нельзя сделать в отдельном потоке, а значит ее в принципе нельзя сделать нормально. 

Из-за этого Farata System вообще отказалась от печати из флэш-плеера, а вместо этого предлагает генерировать PDF-файл с соотвествующим контентом и отдавать его юзеру. Вот пусть он потом этот PDF и печатает.

Ну и готовое решение по генерации PDF на клиенте у Фарата есть, можно юзать. Кому интересно, ищите на их сайте.
Reply all
Reply to author
Forward
0 new messages