AS3 using PrintJob to print a MovieClip
Solution 1
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 );
Solution 2
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 to 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 can take a look at my clip image (and given you understand a little Chinese): it's all in my blog. There are also MovieClip thumbnails (still Chinese).
Related videos on Youtube
Chris Waugh
Updated on April 20, 2020Comments
-
Chris Waugh over 3 years
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. -
Triynko over 14 yearsIf 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.
-
Chris Waugh over 12 yearsI'd not even considered multiple frames, good work :) though as a suggestion, what about removing the reference to the mx:combobox from the function and making the "printPage" variable an optional argument? Would make it a wee bit more flexible.
-
Chris Waugh over 11 yearsI'm gonna have to try this, sounds ace. Thanks!