已经解决MovieClip打印问题

  困扰我多天的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)他对我帮助是很大的,我非常感激。虽然他的代码功能并没完全解决我的打印问题,但是它给了我思路,给我指明了一条可能可行的路,他首先迈出了伟大的第一步,我的改进完全是在他的代码的基础上,结合我的实际问题修改的。建议遇到相同问题的网友,首先要阅读理解好他的源代码。现转载他的代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 打印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

ContractedBlock.gif ExpandedBlockStart.gif 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的所有帧一次全打出来)。

ContractedBlock.gif ExpandedBlockStart.gif 我的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        }
35
36        /* Send print job to printer */
37        printJob.send(); 
38                 /* Delete job from memory */
39        printJob=null;
40
41    }

 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值