已经解决MovieClip打印问题

it2024-11-05  11

  困扰我多天的MovieClip打印问题终于解决了,这就实现了PDF转成SWF后,用户在获取授权后,仍然支持其打印文档(即打印SWF)啦!是令人高兴的事情,“世上无难事,只怕有心人”,只要专注任何问题都可以一步步得到解决的。

      我的打印功能实现截图:

      

      我已经解决的打印问题:实现文档全部打印;支持单独某页(即MovieClip的某帧)的打印;默认全屏打印,在缩放模式下,支持自动调整还原后再打印,从而保证文档充满页面。

     没有实现的打印功能:1.用户自定义多页打印(不是单页打,也不是全打),这个很简单,只是没这需求,我就没添加该功能。2.打印时的预览 3.打印自定义设置(我实现的是页面自适应,不论是A4或B5,都是自动充满页面的),有兴趣的朋友可以在我的基础上对这几方面做进一步的研究。

      很遗憾,对MovieClip的帧生成缩略图工作,没有取得进展,网上没找到相关资料,但我把该任务的一些小问题解决了,有时间的话,我会继续研究的。毕竟领导对该工作也是很期待的很支持的,这功能确实能提高用户体验。

      我的该任务存在的小问题包括:文档的移动(上下左右按钮控制的移动)、鼠标拖动文档(平移文档)、文档位置自动还原功能(自动充满显示页面)、文档放大缩小时中心位置控制等等。这里的文档指的是PDF转换生成的SWF,即加载进来要控制的MovieClip。

      下面介绍一下我在实现MovieClip打印功能时对我帮助很大的网络资源。

       首先是,Chris给出的方案:AS3 Using PrintJob to print  a MovieClip  (网址:http://stackoverflow.com/questions/1422259/as3-using-printjob-to-print-a-movieclip)他对我帮助是很大的,我非常感激。虽然他的代码功能并没完全解决我的打印问题,但是它给了我思路,给我指明了一条可能可行的路,他首先迈出了伟大的第一步,我的改进完全是在他的代码的基础上,结合我的实际问题修改的。建议遇到相同问题的网友,首先要阅读理解好他的源代码。现转载他的代码如下:

打印MovieClip 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(00, 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);

  他主要用的是flash.printing.PrintJob,PrintJob 类用于创建内容并将其打印为一页或多页。此类允许您呈现对用户为可见、动态或在屏幕以外的内容,通过一个“打印”对话框提示用户,以及按照与内容的比例相称的比例打印未缩放的文档。此功能特别适用于呈现和打印动态内容,例如数据库内容和动态文本。

  我个人认为 PrintJob是比较灵活(我指的是打印内容的灵活和打印设置的灵活方面)的打印类的,这原本就是flash里的类。Flex AS3中仍然可以使用,Flex中有对该类的重写即FlexPrintJob,FlexPrintJob 类是 flash.printing.PrintJob 类的包装对象。它支持自动对多个页面上的输出进行切片和分页,并且将网格内容进行缩放以适合打印机的页面大小。 我原本想用该类对象实现我的打印的,但是FlexPrintJob不够灵活,只支持UIComponent对象的打印。其中的关键方法addObject(obj:IUIComponent, scaleType:String = "matchWidth"):void 将 UIComponent 对象添加到正在打印的对象列表。

      下面是使用该FlexPrintJob的例子,Flex中实现一般的UI控件的打印,还是很方便的。转载自Adobe的http://www.adobe.us/livedocs/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=printing_085_07.html

FlexPrintJob <?xml version="1.0"?><!-- printing\DGPrint.mxml --><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">    <mx:Script>        <![CDATA[            import mx.printing.*;            // Create a PrintJob instance.            private function doPrint():void {                // Create an instance of the FlexPrintJob class.                var printJob:FlexPrintJob = new FlexPrintJob();                // Start the print job.                if (printJob.start() != true) return;                // Add the object to print. Do not scale it.                printJob.addObject(myDataGrid, FlexPrintJobScaleType.NONE);                // Send the job to the printer.                printJob.send();            }        ]]>    </mx:Script>    <mx:VBox id="myVBox">        <mx:DataGrid id="myDataGrid" width="300">            <mx:dataProvider>                <mx:Object Product="Flash" Code="1000"/>                <mx:Object Product="Flex" Code="2000"/>                <mx:Object Product="ColdFusion" Code="3000"/>                <mx:Object Product="JRun" Code="4000"/>            </mx:dataProvider>        </mx:DataGrid>        <mx:Button id="myButton"             label="Print"             click="doPrint();"/>    </mx:VBox></mx:Application>

       上面两个资源是我主要参考的资源,网友可以搜索更多打印例子,应该好好利用互联网资源。

       最后介绍和分析我的代码。我的代码最重要的改进就是解决多页连打问题(即MovieClip的所有帧一次全打出来)。

我的MC打印代码  1//打印函数 2private function printMovieClip(clip:MovieClip):void 3{ 4    var printJob:PrintJob=new PrintJob(); 5    var printArea:Rectangle; 6    if (!printJob.start()) 7      return; 8    //获取打印页 9    var printPage:int=selectPages.selectedItem.data;10    if (printPage == 0) //打印所有页面,即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 ///单独打印指定页面,即MovieClip的某帧打印26    {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        }3536        /* Send print job to printer */37        printJob.send(); 38                 /* Delete job from memory */39        printJob=null;4041    }

 

   

转载于:https://www.cnblogs.com/wuhenke/archive/2009/11/17/1604923.html

相关资源:数据结构—成绩单生成器
最新回复(0)