AS3, используя PrintJob для печати мувиклипа - PullRequest
5 голосов
/ 14 сентября 2009

В настоящее время я пытаюсь создать функцию, которая позволит мне передать MovieClip и напечатать его.

Вот упрощенная версия функции:

function printMovieClip(clip:MovieClip) {

var printJob:PrintJob = new PrintJob();
var numPages:int = 0;
var printY:int = 0;
var printHeight:Number;

if ( printJob.start() ) {

/* Resize movie clip to fit within page width */
if (clip.width > printJob.pageWidth) {
   clip.width = printJob.pageWidth;
   clip.scaleY = clip.scaleX;
}

numPages = Math.ceil(clip.height / printJob.pageHeight);

/* Add pages to print job */
for (var i:int = 0; i < numPages; i++) {
 printJob.addPage(clip, new Rectangle(0, printY, printJob.pageWidth, printJob.pageHeight));
 printY += printJob.pageHeight;
}

/* Send print job to printer */
printJob.send();

/* Delete job from memory */
printJob = null;

}

}

printMovieClip( testMC );

К сожалению, это не работает должным образом, то есть печатает полную ширину MovieClip и делает разрывы страницы по длине.

Ответы [ 3 ]

5 голосов
/ 14 сентября 2009

Я забыл масштабировать область печати в соответствии с изменяемым размером видеоклипа. Ниже приведен рабочий раствор:

function printMovieClip(clip:MovieClip) {

    var printJob:PrintJob = new PrintJob();
    var numPages:int = 0;
    var printArea:Rectangle;
    var printHeight:Number;
    var printY:int = 0;

    if ( printJob.start() ) {

        /* Resize movie clip to fit within page width */
        if (clip.width > printJob.pageWidth) {
            clip.width = printJob.pageWidth;
            clip.scaleY = clip.scaleX;
        }

        /* Store reference to print area in a new variable! Will save on scaling calculations later... */
        printArea = new Rectangle(0, 0, printJob.pageWidth/clip.scaleX, printJob.pageHeight/clip.scaleY);

        numPages = Math.ceil(clip.height / printJob.pageHeight);

        /* Add pages to print job */
        for (var i:int = 0; i < numPages; i++) {
            printJob.addPage(clip, printArea);
            printArea.y += printArea.height;
        }

        /* Send print job to printer */
        printJob.send();

        /* Delete job from memory */
        printJob = null;

    }

}

printMovieClip( testMC );
2 голосов
/ 17 ноября 2009

Спасибо за ваш дух с открытым исходным кодом! Основываясь на вашей замечательной работе, я внедряю ее и немного улучшаю, чтобы решить мою практическую проблему с печатью MovieClip. Основным достижением, которое я достиг, является разработка способа печати мувиклипа с несколькими кадрами только за одну отправку задания на печать. Конечно, я решил вопрос «распечатки ролика на всю ширину». Поскольку SWF хранит контент в форме векторографа, вам нужно убедиться, что clip.height = printArea.height; clip.width = printArea.width;. Это простой способ:

 1//MC printing Function 
 2private function printMovieClip(clip:MovieClip):void
 3{
 4    var printJob:PrintJob=new PrintJob();
 5    var printArea:Rectangle;
 6    if (!printJob.start())
 7      return;
 8    //The page you choose to print ,"selectPages" is a mx:combox object i used to support printing one frame of MC
 9    var printPage:int=selectPages.selectedItem.data;
10    if (printPage == 0) //print all frames of the MovieClip
11      {
12        for (var i:int=1; i <= clip.totalFrames; i++)
13        {
14          clip.gotoAndStop(i);
15          /* Resize movie clip to fit within page width */
16          clip.width=printJob.pageWidth;
17          clip.scaleY=clip.scaleX;
18          /* Store reference to print area in a new variable! Will save on scaling */
19          printArea=new Rectangle(0, 0, printJob.pageWidth, printJob.pageHeight);
20          //numPages=Math.ceil(clip.height / printJob.pageHeight);
21                  /* Add pages to print job */
22          printJob.addPage(clip, printArea);
23        }
24      }
25    else //print the selected frame
26    {
         //goto the selected frame firstly
27        clip.gotoAndStop(printPage);
28        /* Resize movie clip to fit within page width */
29        clip.width=printJob.pageWidth;
30        clip.scaleY=clip.scaleX;
31        printArea=new Rectangle(0, 0, printJob.pageWidth, printJob.pageHeight);
32         /* Add pages to print job */
33        printJob.addPage(clip, printArea);
34        }
35
36        /* Send print job to printer */
37        printJob.send(); 
38         /* Delete job from memory */
39        printJob=null;
40
41    }

Если вам нужна дополнительная информация, вы можете взглянуть на мое изображение клипа (и, если вы немного понимаете по-китайски): все это в моем блоге . Есть также миниатюры MovieClip (все еще китайский).

0 голосов
/ 16 июня 2012

Я добавил небольшое исправление, которое сбрасывает размеры мувиклипа после выполнения задания на печать. Проблема заключалась в том, что когда вы печатаете что-то больше, чем ваша страница, код также масштабирует мувиклип на сцене. Так что я исправил это ... ничего особенного, но может быть полезно для других людей:)

этот код также исправляет тот факт, что ваши прозрачные PNG-файлы также будут прозрачными на вашем отпечатке

protected function printMovieClip(clip:MovieClip):void {

            var printJob:PrintJob = new PrintJob();
            var printJobOptions:PrintJobOptions = new PrintJobOptions();
            var numPages:int = 0;
            var printArea:Rectangle;
            var printHeight:Number;
            var printY:int = 0;
            var originalWidth:Number;
            var originalHeight:Number;

            if ( printJob.start() ) {

                originalWidth = clip.width;
                originalHeight = clip.height;

                if (clip.width > printJob.pageWidth) {
                    clip.width = printJob.pageWidth;
                    clip.scaleY = clip.scaleX;
                }

                printArea = new Rectangle(0, 0, printJob.pageWidth/clip.scaleX, printJob.pageHeight/clip.scaleY);

                numPages = Math.ceil(clip.height / printJob.pageHeight);

                for (var i:int = 0; i < numPages; i++) 
                {
                    printJobOptions.printAsBitmap = true;
                    printJob.addPage(clip, printArea, printJobOptions);
                    printArea.y += printArea.height;
                }

                /* Send print job to printer */
                printJob.send();

                /* Delete job from memory */
                printJob = null;

                /* reset the clips width and height on stage so it is back at its original size*/
                clip.width = originalWidth;
                clip.height = originalHeight;
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...