PDA

Просмотр полной версии : Как "разбить" DisplayObject на части


Чеширский Кот
21.09.2012, 15:32
Здравствуйте!

Есть контейнер: vg_screen (spark:VGroup). В нем находится видимая часть генеалогического дерева.
И есть контейнер: g_tree (spark:Group). В нем находится все дерево.

Размеры одной части - это ширина и высота vg_screen
Допустим, получится 3 части и дерево выходит за рамки экрана только по горизонтали.



var pagesForPDF:Array = [];

var widthScreen:int = vg_screen.width;
var heightScreen:int = vg_screen.height;

for (var i:int=0;i<3;i++)
{
var image:DisplayObject = vg_screen as DisplayObject;
image.scrollRect = new Rectangle(widthScreen*i,0,widthScreen,heightScreen);
pagesForPDF.push(image);
}


Проблема в том, что таким образом все три image одинаковы и равны последнему.
Связь сохраняется с vg_screen.
Либо другой алгоритм нужен, либо как "разорвать" эту связь?
Как сделать самостоятельными части?

alatar
23.09.2012, 17:40
Отрисовать в BitmapData.

Чеширский Кот
09.10.2012, 16:08
Спасибо, помогло "разбить" на части.


private var pagesForPDF:Array = [];

protected function saveToPdf():void
{
pagesForPDF = [];

// ширина и высота для страницы в PDF
var widthScreen:int = dataCollector.thisMain.vg_main.width;
var heightScreen:int = dataCollector.thisMain.vg_main.height;

// Часть дерева на экране
var screenPartTree:DisplayObject = dataCollector.thisMain.vg_main as DisplayObject;
// Запоминаем положение экрана на дереве
var rect:Rectangle = screenPartTree.scrollRect;

// Все дерево целиком
var fullTree:DisplayObject = dataCollector.thisMain.patriarch as DisplayObject;
// определяем количество страниц для файла PDF
var row:int = Math.ceil(fullTree.width/widthScreen);
var column:int = Math.ceil(fullTree.height/heightScreen);

for (var i:int=0;i<column;i++)
{
for (var j:int=0;j<row;j++)
{
screenPartTree.scrollRect = new Rectangle(widthScreen*j,heightScreen*i,widthScreen,heightScreen);;

var bitmapData:BitmapData = new BitmapData(widthScreen, heightScreen, false, 0xFFFFFF);
bitmapData.draw(screenPartTree);

var encoder:JPEGEncoder = new JPEGEncoder(100);
var byteArray:ByteArray = encoder.encode(bitmapData);
pagesForPDF.push(byteArray);
}
}

// Возвращаем прежнее положение экрана
screenPartTree.scrollRect = rect;

createPdf(pagesForPDF);
}


А дальше, используя библиотеку AlivePDF, сохранял в PDF.


// Формируем свойства страниц PDF
public function generate():void
{
pdf = new PDF(Orientation.LANDSCAPE, Unit.MM, Size.TABLOID);
pdf.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);
}

private function loadImage(image:ByteArray):void
{
var resizeM:Resize = new Resize(Mode.RESIZE_PAGE,Position.CENTERED);
pdf.addPage();
pdf.addImageStream(image,ColorSpace.DEVICE_RGB, resizeM,0,0,0,0,0,1);
}

private function save():void
{
this.pdf.end();
var bytes:ByteArray = this.pdf.save(Method.LOCAL);
var fileReference:FileReference = new FileReference();
fileReference.addEventListener(Event.SELECT,onEndWorkWithPDF);
fileReference.addEventListener(Event.CANCEL,onEndWorkWithPDF);
fileReference.save(bytes,"Дерево.pdf");
}


Но проблема в том, что качество не для печати.
Это я так понимаю сохраняю растровое изображение, и при увеличении качество теряется.

Как можно сохранить DisplayObject в PDF без потери качества? Можно и без "разбиения" на части.
На первое место вышло сохранение данных пригодных для качественной печати.

alatar
09.10.2012, 16:53
...без потери качества?
Делать картинку из расчета ~300dpi и изменить pixelSize страницы (по-умолчанию страницы создаются 72dpi).
Или, если у вас векторная графика, можно сконвертировать в EPS и добавить через addEPSImage или распарсить с помощью swfvector (http://code.google.com/p/swfvector/) и отрисовать через методы рисования PDF.

Чеширский Кот
11.10.2012, 16:27
Да, качество картинки 300 dpi.
Векторная графика.
"swfvector" не закачать или я что-то не так делаю, поэтому опробовать этот вариант не могу.
Сконвертировать в EPS звучит заманчиво, вот только примеров ... днем с огнем.

alatar
11.10.2012, 18:34
"swfvector" не закачать или я что-то не так делаю, поэтому опробовать этот вариант не могу.
В смысле?
Поставьте svn (http://subversion.apache.org/packages.html) или TortoiseSVN (http://tortoisesvn.net/) и скачайте исходники (http://code.google.com/p/swfvector/source/checkout).