Flash AS3使用PrintJob打印电影剪辑

Flash AS3使用PrintJob打印电影剪辑,flash,actionscript-3,printing,flashdevelop,Flash,Actionscript 3,Printing,Flashdevelop,我目前正在尝试创建一个函数,允许我传入一个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 f

我目前正在尝试创建一个函数,允许我传入一个
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 );
函数printMovieClip(剪辑:MovieClip){
var printJob:printJob=new printJob();
变量numPages:int=0;
变量printY:int=0;
var打印高度:数字;
if(printJob.start()){
/*调整电影剪辑大小以适应页面宽度*/
如果(clip.width>printJob.pageWidth){
clip.width=printJob.pageWidth;
clip.scaleY=clip.scaleX;
}
numPages=Math.ceil(clip.height/printJob.pageHeight);
/*将页面添加到打印作业*/
对于(变量i:int=0;i

不幸的是,这没有按预期工作,即打印
电影剪辑的全宽,并在长度上执行分页符。

我忘记缩放打印区域以匹配正在调整大小的电影剪辑。工作解决方案见下文:

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 );
函数printMovieClip(剪辑:MovieClip){
var printJob:printJob=new printJob();
变量numPages:int=0;
var打印区域:矩形;
var打印高度:数字;
变量printY:int=0;
if(printJob.start()){
/*调整电影剪辑大小以适应页面宽度*/
如果(clip.width>printJob.pageWidth){
clip.width=printJob.pageWidth;
clip.scaleY=clip.scaleX;
}
/*在新变量中存储对打印区域的引用!稍后将保存缩放计算*/
printArea=新矩形(0,0,printJob.pageWidth/clip.scaleX,printJob.pageHeight/clip.scaleY);
numPages=Math.ceil(clip.height/printJob.pageHeight);
/*将页面添加到打印作业*/
对于(变量i:int=0;i
感谢您的开源精神!基于你出色的工作,我实施了它并做了一些改进,以解决我实际的电影唇印问题。我取得的主要进展是找到了一种方法,通过发送一个printjob就可以打印出多帧的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    }
1//MC打印功能
2私有函数printMovieClip(剪辑:MovieClip):无效
3{
4 var printJob:printJob=new printJob();
5.打印区域:矩形;
6如果(!printJob.start())
7返回;
8//您选择打印的页面,“selectPages”是一个mx:combox对象,我用于支持打印一帧MC
9 var printPage:int=selectPages.selectedItem.data;
10 if(printPage==0)//打印MovieClip的所有帧
11      {

12对于(var i:int=1;i我添加了一个小修复程序,在打印作业完成后重置MovieClip的尺寸。问题是,当您打印的内容比页面大时,代码也会在舞台上缩放MovieClip。因此我修复了…没有什么特别之处,但可能对其他人有用:)

此代码还修复了这样一个事实,即您的透明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;
            }

        }
受保护功能printMovieClip(剪辑:MovieClip):无效{
var printJob:printJob=new printJob();
var printJobOptions:printJobOptions=new printJobOptions();
变量numPages:int=0;
var打印区域:矩形;
var打印高度:数字;
变量printY:int=0;
变量原始宽度:数字;
变量原始高度:数字;
if(printJob.start()){
原始宽度=clip.width;
原始高度=clip.height;
如果(clip.width>printJob.pageWidth){
clip.width=printJob.pageWidth;
clip.scaleY=clip.scaleX;
}
printArea=新矩形(0,0,printJob.pageWidth/clip.scaleX,printJob.pageHeight/clip.scaleY);
numPages=Math.ceil(clip.height/printJob.pageHeight);
对于(变量i:int=0;i
如果这样做有效(我还没有尝试过…),那就谢谢你了,因为这是一个非常通用和有用的例子,说明了如何在Flash AS3中打印跨越多个页面的大型MovieClip。我甚至没有考虑多个帧,做得很好:)不过作为一个建议,从函数中删除对mx:combobox的引用并使“printPage”变量一个可选参数?会让它更灵活一点。我得试试这个,听起来不错。谢谢!