views:

4063

answers:

3

Hello,

I am currently trying to create a function which will allow me to pass in a movieclip and print it.

Here is the simplified version of the function:

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 );

Unfortunately this is not working as expected i.e. printing the full width of the Movieclip and doing page breaks on the length.

Any help with this would be greatly appreciated.

Many thanks,

Chris

A: 

I forgot to scale the print area to match the movie clip being resized. See below for working solution:

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 );
Chris Waugh
If this works (I haven't tried it yet...), then thanks, because it's a very general and useful example of how to print a large MovieClip to span multiple pages in Flash AS3.
Triynko
A: 

Thank You very much, it works cool!

shane
A: 

Hi Chris,

Thank you for your Open-source spirit!Based on your great work,I implement it and make a little improvement to solve my practical MovieClip-printing problem. The major progress i have made is to work out a way of printing a MovieClip with Multi-frames only by one printjob sending.of course, i resolved the question of "printing the full width of the Movieclip ".Because swf stores content in the form of vectorgraph,what you need do is make sure "clip.height=printArea.height;clip.width=printArea.width;". It is a easy way.

 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    }

If you want more information ,you want to look at my clip image and you understand a little chinese, welcome you visit my blog:http://www.cnblogs.com/wuhenke/archive/2009/11/17/1604923.html

MovieClip thumbnails : www.cnblogs.com/wuhenke/archive/2009/11/19/1605926.html

best wishes!

wuhenke

wuhenke