Flex打印

Flex 打印常使用PrintDataGrid,但会有一些问题,不支持表格单元格合并,有的可能需要打印一些flex组件和容器(VBox, HBox, Text, Image)等。重写flex的Grid表格,Grid类似HTML的table, 能很好支持单元格合并,单元格中加入组件和容器。

自定义PrintDataGrid:

public class PrintDataGrid extends Grid
    {
       public static const pageHeight:int = 1023;
 
       private var _realWidth:int;
 
       public function PrintDataGrid()
       {
           this.horizontalScrollPolicy = ScrollPolicy.OFF;
           this.verticalScrollPolicy = ScrollPolicy.OFF;
 
           super();
       }
 
       public function addGridRow(gridRow:RowGrid):void {
           addCells(gridRow.getAvailableCell(), gridRow.height);
       }
 
       private function addCells(cells:Array, height:Number):void {
           var gridRow:GridRow = new GridRow();
           for each(var cell:GridCell in cells) {
              gridRow.addChild(cell);
           }
           gridRow.height = height;
           this.addChild(gridRow);
       }
 
       public function get realWidth():int
       {
           return _realWidth;
       }
 
       public function set realWidth(value:int):void
       {
           _realWidth = value;
       }
    }

Adobe对于多页打印或打印预览都没有提供一个很好的解决办法,但可以根据Grid中GridRow的height,计算自动拆分表格,将一个大的Grid拆分每一个页面一个Grid,进行分页预览和打印。大概的算法:根据每页的height值计算一个页面能存放多少Grid的GridRow,超过的拆分到下一个页面,如果需要拆分的单元格存在被合并的情况,也就是GridItem 中RowSpan > 1, 则需要将一个GridItem,分为两个GridItem,而这两个的GridItem的rowSpan之和为原来的GridItem的RowSpan。

合并单元格拆分:

public function splitRowSpan(gridCellArray:GridCellArray):void {
           if(cells.length == 0) {
               return;
           }
           for(var i:int = 0; i < cells.length; i++) {
              var gridCell:GridCell = cells[i] as GridCell;
              if(gridCell == null) {
                  continue;
              }
              var splitCell:GridCell = null;
              if (gridCell.isRemove) {
                  splitCell = gridCell.mergerCell;
              }
              if (splitCell == null) {
                  continue;
              }
              if (gridCell.rNum == splitCell.rNum) {
                  continue;
              }
              var orgRowSpan:int = splitCell.rowSpan;
              var extRowSpan:int = gridCell.rNum - splitCell.rNum;
             
              var content:DisplayObject = splitCell.getChildAt(0);
             
              var topCellHeight:Number = getExtRowSpanHeight(splitCell.rNum, splitCell.rNum + extRowSpan, gridCellArray);
              var bottomCellHeight:Number = getExtRowSpanHeight(splitCell.rNum + extRowSpan, splitCell.rNum + splitCell.rowSpan, gridCellArray);
             
              splitCell.rowSpan = extRowSpan;
              splitCell.height = topCellHeight;
              if(topCellHeight < bottomCellHeight) {
                  splitCell.removeAllChildren();
              }
             
              var  bottomCell:GridCell = splitCell.newGridCell();
              bottomCell.rowSpan = orgRowSpan - extRowSpan;
              bottomCell.colSpan = splitCell.colSpan;
              bottomCell.height = bottomCellHeight;
              bottomCell.rNum = gridCell.rNum;
              bottomCell.cNum = gridCell.cNum;
              if(topCellHeight < bottomCellHeight) {
                  bottomCell.addChild(content);
              }
             
              var gridRow:RowGrid = gridCellArray.getRowGrid(gridCell.rNum);
              gridRow.setCell(bottomCell, bottomCell.cNum);
              if (bottomCell.rowSpan > 1 || bottomCell.colSpan > 1) {
                  gridCellArray.mergerGridCell(bottomCell);
              }
           }
       }

原文出处: http://www.anyrt.com/blog/list/201609131739.html

时间: 2024-10-25 04:39:42

Flex打印的相关文章

flex打印图片

<?xml version="1.0" encoding="utf-8"?><s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"        xmlns:s="library://ns.adobe.com/flex/spark"        xmlns:mx="library://ns.adobe.com/flex/mx&

flex eclipse整合spring入门

最先下载FlashBuilder_4_7_LS10_win64.exe试了几个eclipse安装插件都没成功,包括myeclipse8.5.spring sts2.9.2.eclipse3.5.j2eeeclipse版本4.2.0,后来搞了一个FlashBuilder_4_LS10.exe安装完找不到插件安装文件原来这个是单独版,必须插件版才行,最后下载FlashBuilder_4_Plugin_LS10.exe终于配置成功了,myeclipse8.5不行,spring sts可以了. spri

Flex 自定义打印控件编写

打印历来是web应用一个比较棘手的问题,幸好flex web应用是运行在flash player上的,flash player可以访问打印机,所以flex 应用可以实现比较强大的打印功能.Flex 自身提供的printjob.flexprintjob相对来说用起来不是很方便,对于有严格纸张设置.翻页等打印需求,略显功能不足,因此需要基于printjob或flexprintjob来完善flex的打印功能,及自定义打印控件. 本控件核心为: 1)PrintManager,打印控制核心类 2)IPri

arcgis for flex api version3.7 教程:10.打印服务功能简介

高质量的打印功能是arcgis server 10.1的新特性功能.arcgis api for flex在3.x版本之前使用的是flex sdk基本的打印功能.而完全的在线制图打印功能需要web应用来实现. arcgis api for flex 高级打印功能是通过printtask类来实现的.该类通过arcgis 10.1版本的export web map GP服务来实现,可以进行配置,提供输出设置,可以是PDF,PNG,SVG. 在作用GP服务之前,需要启动arcgis 10.1打印服务(

南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(七)地图打印模块

config.xml文件的配置如下: 1 <widget label="地图打印" 2 icon="assets/images/map_print.png" config="widgets/Print/PrintWidget.xml" 3 url="widgets/Print/PrintWidget.swf" /> 源代码目录如下: 模块的源代码原理解析,详细的代码在下载的开源flexviewer自带的: 大概的思

flex 分页打印表格功能

private function printHandler():void{ var printJob:FlexPrintJob = new FlexPrintJob(); printJob.printAsBitmap = true; if (printJob.start()){ var myPrintData:PrintDataGrid=new PrintDataGrid(); var dataCol:DataGridColumn = new DataGridColumn(); dataCol.

基于restful注解(spring4.0.2整合flex+blazeds+spring-mvc)&lt;一&gt;

摘自: http://www.blogjava.net/liuguly/archive/2014/03/10/410824.html 参考官网:1.http://livedocs.adobe.com/blazeds/1/blazeds_devguide/2.http://docs.spring.io/spring-flex/docs/1.5.2.RELEASE/reference/html/1)下载blazeds(turnkey4.0.x版本)网址:http://sourceforge.net/

Flex的正则表达式匹配速度与手工代码的比较

flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷自动机,这使得flex等词法分析器生成器生成的词法分析器匹配输入模式的效率非常高.当然,有人指责flex不够灵活,功能有限,很多问题都无法解决,比如Javascript.C++等语言中二义性的问题,实际上很多程序(比如Python的解释器)的词法分析器都是用的手工代码而不是flex自动生成的.这些都

flex 操作xml 实现增删改查 .

一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为“元素”    节点:把XML元素与文本结合起来统称为节点    根节点:位于整个XML文当顶端的节点    文本节点:包含文本的节点    属性:元素的组成部分,以键/值形式放在元素标签内 用一个例子来说明 view plaincopy to clipboardprint?<root_node><!--这是一个根节点也是一个元素-->            &l