2012-06-29 65 views
2

如果我在UIComponent.filters屬性中分配過濾器,它們在屏幕上顯示得很好,但是當我通過FlexPrintJob打印它們時,它們將被忽略。FlexPrintJob不打印圖形過濾器

我試過DropshadowFilter,BlurFilter,BevelFilter。他們都沒有出現。我嘗試了所有的位圖緩存模式。另外printAsBitmap。

您可以嘗試轉到FlexDrintJob的ASDoc示例。只需將過濾器分配給某些打印組件。

你能告訴我該怎麼做嗎?

我把一個過濾器的第一個文件:

enter code here 


FormPrintHeader.mxml 

<?xml version="1.0"?> 
<!-- Custom control for the header area of the printed page. --> 
<s:VGroup name="FormPrintHeader" 
     xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     width="60%" 
     horizontalAlign="right" filters="{[new spark.filters.BlurFilter]}"> 

    <s:Label text="This is a placeholder for first page contents"/> 

</s:VGroup> 

FormPrintFooter.mxml 

<?xml version="1.0"?> 
<!-- Custom control for the footer area of the printed page. --> 
<s:VGroup name="FormPrintFooter" 
     xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     width="60%" 
     horizontalAlign="right" > 

    <!-- Declare and initialize the product total variable. --> 
    <fx:Script> 
     <![CDATA[ 
      [Bindable] 
      public var pTotal:Number = 0; 
     ]]> 
    </fx:Script> 

    <s:Label text="Product Total: {pTotal}"/> 

</s:VGroup> 

FormPrintView.mxml 

<?xml version="1.0"?> 
<!-- Custom control to print the Halo DataGrid control on multiple pages. --> 
<s:VGroup name="FormPrintView" 
     xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" 
     xmlns="*"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.core.*; 

      // Declare and initialize the variables used in the component. 
      // The application sets the actual prodTotal value. 
      [Bindable] 
      public var pageNumber:Number = 1; 

      [Bindable] 
      public var prodTotal:Number = 0; 

      // Control the page contents by selectively hiding the header and 
      // footer based on the page type. 
      public function showPage(pageType:String):void { 
       if (pageType == "first" || pageType == "middle") { 
        // Hide the footer. 
        footer.includeInLayout = false; 
        footer.visible = false; 
       } 
       if (pageType == "middle" || pageType == "last") { 
        // The header won't be used again; hide it. 
        header.includeInLayout = false; 
        header.visible = false; 
       } 
       if (pageType == "last") { 
        // Show the footer. 
        footer.includeInLayout = true; 
        footer.visible = true; 
       } 
       //Update the DataGrid layout to reflect the results. 
       validateNow(); 
      } 
     ]]> 
    </fx:Script> 

    <!-- The template for the printed page, with the contents for all pages. --> 
    <s:VGroup width="80%" horizontalAlign="left"> 
     <s:Label text="Page {pageNumber}"/> 
    </s:VGroup> 

    <FormPrintHeader id="header" /> 

    <!-- The data grid. The sizeToPage property is true by default, so the last 
     page has only as many grid rows as are needed for the data. --> 
    <mx:PrintDataGrid id="myDataGrid" width="60%" height="100%"> 
     <!-- Specify the columns to ensure that their order is correct. --> 
     <mx:columns> 
      <mx:DataGridColumn dataField="Index" /> 
      <mx:DataGridColumn dataField="Qty" /> 
     </mx:columns> 
    </mx:PrintDataGrid> 

    <!-- Create a FormPrintFooter control and set its prodTotal variable. --> 
    <FormPrintFooter id="footer" pTotal="{prodTotal}" /> 

</s:VGroup> 

PrintDataGridExample.mxml 

<?xml version="1.0"?> 
<!-- Main application to print a Halo DataGrid control on multiple pages. --> 
<s:Application name="PrintDataGridExample.mxml" 
     xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" 
     initialize="initData();"> 

    <fx:Script> 
     <![CDATA[ 

     import mx.printing.*; 
     import mx.collections.ArrayCollection; 
     import FormPrintView; 
     import mx.core.FlexGlobals; 

     // Declare variables and initialize simple variables. 
     [Bindable] 
     public var dgProvider:ArrayCollection; 
     public var footerHeight:Number = 20; 
     public var prodIndex:Number; 
     public var prodTotal:Number = 0; 

     // Data initialization. 
     public function initData():void { 
      // Create the data provider for the DataGrid control. 
      dgProvider = new ArrayCollection; 
     } 

     // Fill the dgProvider ArrayCollection with the specified items. 
     public function setdgProvider(items:int):void { 
      prodIndex=1; 
      dgProvider.removeAll(); 
      for (var z:int=0; z<items; z++) { 
       var prod1:Object = {}; 
       prod1.Qty = prodIndex * 7; 
       prod1.Index = prodIndex++; 
       prodTotal += prod1.Qty; 
       dgProvider.addItem(prod1); 
      } 
     } 

     // The function to print the output. 
     public function doPrint():void { 
      var printJob:FlexPrintJob = new FlexPrintJob(); 
      if (printJob.start()) { 
       // Create a FormPrintView control as a child of the current view. 
       var thePrintView:FormPrintView = new FormPrintView(); 
       FlexGlobals.topLevelApplication.addElement(thePrintView); 

       //Set the print view properties. 
       thePrintView.width=printJob.pageWidth; 
       thePrintView.height=printJob.pageHeight; 
       thePrintView.prodTotal = prodTotal; 
       // Set the data provider of the FormPrintView component's data grid 
       // to be the data provider of the displayed data grid. 
       thePrintView.myDataGrid.dataProvider = myDataGrid.dataProvider; 
       // Create a single-page image. 
       thePrintView.showPage("single"); 
       // If the print image's data grid can hold all the provider's rows, 
       // add the page to the print job. 
       if (!thePrintView.myDataGrid.validNextPage) { 
        printJob.addObject(thePrintView); 
       } 
       // Otherwise, the job requires multiple pages. 
       else { 
        // Create the first page and add it to the print job. 
        thePrintView.showPage("first"); 
        printJob.addObject(thePrintView); 
        thePrintView.pageNumber++; 
        // Loop through the following code until all pages are queued. 
        while (true) { 
         // Move the next page of data to the top of the print grid. 
         thePrintView.myDataGrid.nextPage(); 
         thePrintView.showPage("last"); 
         // If the page holds the remaining data, or if the last page 
         // was completely filled by the last grid data, queue it for printing. 
         // Test if there is data for another PrintDataGrid page. 
         if (!thePrintView.myDataGrid.validNextPage) { 
          // This is the last page; queue it and exit the print loop. 
          printJob.addObject(thePrintView); 
          break; 
         } else { 
          // This is not the last page. Queue a middle page. 
          thePrintView.showPage("middle"); 
          printJob.addObject(thePrintView); 
          thePrintView.pageNumber++; 
         } 
        } 
       } 
       // All pages are queued; remove the FormPrintView control to free memory. 
       FlexGlobals.topLevelApplication.removeElement(thePrintView); 
      } 
      // Send the job to the printer. 
      printJob.send(); 
     } 
     ]]> 
    </fx:Script> 

    <s:Panel title="DataGrid Printing Example" 
      width="75%" height="75%" 
      horizontalCenter="0" verticalCenter="0"> 
     <s:VGroup left="10" right="10" top="10" bottom="10"> 
      <mx:DataGrid id="myDataGrid" dataProvider="{dgProvider}"> 
       <mx:columns> 
        <mx:DataGridColumn dataField="Index"/> 
        <mx:DataGridColumn dataField="Qty"/> 
       </mx:columns> 
      </mx:DataGrid> 

      <s:Label width="100%" color="blue" 
       text="Specify the number of lines and click Fill Grid first. Then you can click Print."/> 

      <s:TextInput id="dataItems" text="35"/> 

      <s:HGroup> 
       <s:Button id="setDP" label="Fill Grid" click="setdgProvider(int(dataItems.text));"/> 
       <s:Button id="printDG" label="Print" click="doPrint();"/> 
      </s:HGroup> 
     </s:VGroup> 
    </s:Panel> 

</s:Application> 
+0

添加一些示例代碼..... –

回答

1

請修改您的FormPrintHeader.mxml與下面的代碼: -

<?xml version="1.0"?> 
<!-- Custom control for the header area of the printed page. --> 
<s:VGroup name="FormPrintHeader" 
      xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      width="60%" 
      horizontalAlign="right" xmlns:mx="library://ns.adobe.com/flex/mx" 
      filters="{[new flash.filters.BlurFilter()]}" creationComplete="addHeaderPrinting(this)"> 
    <fx:Script> 
     <![CDATA[ 
      import flash.filters.BlurFilter; 

      import mx.graphics.ImageSnapshot; 

      private function addHeaderPrinting(source:IBitmapDrawable):void { 
       var imageBitmapData:BitmapData = ImageSnapshot.captureBitmapData(source); 
       swfLoader.source = new Bitmap(imageBitmapData); 
       mylblPrint.includeInLayout = mylblPrint.visible = false; 
      } 
     ]]> 
    </fx:Script> 

    <mx:Label id="mylblPrint" 
      text="This is a placeholder for first page contents. This is a placeholder for first page contents"/> 
    <mx:SWFLoader id="swfLoader" > 
     <mx:filters> 
      <mx:BlurFilter /> 
     </mx:filters> 
    </mx:SWFLoader> 
</s:VGroup> 

希望這可以幫助你。