Flex 自定义打印控件编写

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

本控件核心为:

1)PrintManager,打印控制核心类

2)IPrintableDocument,打印文档设置,打印文档有3部分组成,分别是:PrintableHeader、PrintableBody、PrintableFooter。

因此,开发人员只要设计好printabledocument,重点排版好header、body、footer,然后调用PrintManager的打印即可打印printabledocument了。


<print:PrintableDocument

printableBody="{p_body}" printableFooter="{p_footer}" printableHeader="{p_header}">

<print:PrintableHeader width="100%" id="p_header" x="0" y="0" height="81" >

<mx:Label id="pageHeader" text="Sample Accounts" styleName="printTitle" width="100%" textAlign="center"/>

<mx:Label id="cityHeader" text="City Of Somewheretown" width="100%" textAlign="center" />

<mx:Label id="entityHeader" text="General Accounts" width="100%" textAlign="center"/>

</print:PrintableHeader>

<print:PrintableBody id="p_body" width="100%" bottom = "28" x="0" top="81">

<mx:PrintAdvancedDataGrid id="accountsDataGrid" designViewDataType="flat"

dataProvider="{accounts}" horizontalGridLines="false" verticalGridLines="false"

width="100%" height="100%" borderStyle="none" sortExpertMode="true" headerHeight="0"

rowHeight="30">

<mx:columns>

<mx:AdvancedDataGridColumn headerText="Account Number" dataField="account" textAlign="center" width="100"/>

<mx:AdvancedDataGridColumn headerText="Control Account" dataField="control" textAlign="center" width="100"/>

<mx:AdvancedDataGridColumn headerText="Description" dataField="description" width="300"/>

</mx:columns>

</mx:PrintAdvancedDataGrid>

</print:PrintableBody>

<print:PrintableFooter id="p_footer" width="100%" height="28" bottom="0" left="0" printType="perpage">

<mx:Label text="Prepared by: Authorname" width="33%" textAlign="center"/>

<mx:Label text="Page {pageNumber} of {pageCount}" width="34%" textAlign="right"/>

<mx:Label id="pageFooter" text="Sample Accounts" width="33%"/>

</print:PrintableFooter>

</print:PrintableDocument>

附上控件核心类的相关代码。

1、PrintManager


public class PrintManager

{

public function PrintManager()

{

}

public function print(document:IPrintableDocument, parent:UIComponent = null):Boolean

{

var printJob:PrintJob = new PrintJob();

if (parent != null)

parent.addChild(document.displayObject());

var printed:Boolean = printInternal(document, printJob);

if (parent != null)

parent.removeChild(document.displayObject());

return printed;

}

private functionunscaleDocument(document:IPrintableDocument):void

{

document.scaleX = 1.0;

document.scaleY = 1.0;

document.validateNow();

}

/**

* adjust print orientation

* scale the printdocument

*/

private functionrotateDocumentForPaperOrientation(document:IPrintableDocument, printJob:PrintJob):void

{

document.x = 0;

document.y = 0;

var scaleFactor:Number = 1.0;

//

document.scaleX = scaleFactor;

document.scaleY = scaleFactor;

document.validateNow();

}

private function printPage(document:IPrintableDocument, printJob:PrintJob):void

{

var width:Number = document.desiredWidth;

var height:Number = document.desiredHeight;

var page:Sprite = Sprite(document);

var printableArea:Rectangle = new Rectangle(0, 0, width, height);

printJob.addPage(page, printableArea);

}

public function printInternal(document:IPrintableDocument, printJob:PrintJob):Boolean

{

//start printer

if (!printJob.start()) {

return false;

}

document.moveToFirstPage();

unscaleDocument(document);

//adjust paper orientation

rotateDocumentForPaperOrientation(document, printJob);

//add first print page

printPage(document, printJob);

while(document.validNextPage)

{

document.nextPage();

printPage(document, printJob);

}

printJob.send();

return true;

}

}

2、IPrintableDocument


public interface IPrintableDocument extends IUIComponent, IEventDispatcher

{

function nextPage():void;

function get validNextPage():Boolean;

function previousPage():void;

function moveToFirstPage():void;

function validateNow():void;

function displayObject():DisplayObject;

function get desiredWidth():Number;

function get desiredHeight():Number;

function get printableFooter():PrintableFooter;

function get printableHeader():PrintableHeader;

function get printableBody():PrintableBody;

function set printableBody(body:PrintableBody):void;

function set printableHeader(header:PrintableHeader):void;

function set printableFooter(footer:PrintableFooter):void;

function get totalPageCount():Number;

function get currentPageNumber():Number;

}

3、PrintableDocument


public class PrintableDocument extends VGroup implementsIPrintableDocument

{

[Bindable]public var pageNumber:Number = 1;

[Bindable]public var pageCount:Number = 1;

private var _body:PrintableBody;

private var _header:PrintableHeader;

private var _footer:PrintableFooter;

private var _desiredWidth:Number = 595;

private var _desiredHeight:Number = 842;

//

public function PrintableDocument(){

this.gap = 0;

}

public function get desiredWidth():Number

{

return _desiredWidth;    //21cm, A4,1cm=28.346px

}

public function set desiredWidth(value:Number):void{

_desiredWidth = value;

}

public function set desiredHeight(value:Number):void{

_desiredHeight = value;

}

public function get desiredHeight():Number

{

return _desiredHeight;   //29.7cm, A4

}

public function get totalPageCount():Number{

return pageCount;

}

public function get currentPageNumber():Number{

return pageNumber;

}

public function displayObject():DisplayObject

{

return this;

}

public function get validNextPage():Boolean

{

return printableBody.printGrid.validNextPage;

}

public function nextPage():void

{

printableBody.printGrid.nextPage();

pageNumber++;

if(pageNumber == 2)

{

removeHeaderFromLayout();

}

if(!validNextPage){

includeFooterInLayout();

}

validateNow();

}

/**

* move to previous page.

*/

public function previousPage():void

{

printableBody.printGrid.previousPage();

pageNumber--;

if (pageNumber == 1)

{

includeHeaderInLayout();

}

removeFooterFromLayout();

validateNow();

//         dispatchEvent(new Event("validPagesChanged"));

}

/**

* move to first page.

*/

public function moveToFirstPage():void

{

pageNumber = 1;

printableBody.printGrid.moveToFirstPage();

includeHeaderInLayout();

removeFooterFromLayout();

validateNow();

}

/**

* calcutate page count.

*/

public function calculatePageCount():void

{

var count:Number=1;

moveToFirstPage();

while(printableBody.printGrid.validNextPage)

{

count++;

if(count == 2)

{

removeHeaderFromLayout();

}

printableBody.printGrid.nextPage();

validateNow();

}

pageCount = count;

moveToFirstPage();

}

private function includeHeaderInLayout():void

{

printableHeader.includeInLayout = true;

printableHeader.visible = true;

}

private function removeHeaderFromLayout():void

{

if(printableHeader.printType==PrintableHeader.PRINTTYPE_FIRSTPAGE){

printableHeader.includeInLayout = false;

printableHeader.visible = false;

}

}

private function includeFooterInLayout():void{

printableFooter.includeInLayout = true;

printableFooter.visible = true;

}

private function removeFooterFromLayout():void{

if(printableFooter.printType==PrintableFooter.PRINTTYPE_LASTPAGE && validNextPage){

printableFooter.includeInLayout = false;

printableFooter.visible = false;

}

}

public function get printableBody():PrintableBody{

return _body;

}

public function set printableBody(body:PrintableBody):void{

this._body = body;

}

public function get printableFooter():PrintableFooter{

return _footer;

}

public function setprintableFooter(footer:PrintableFooter):void{

this._footer = footer;

}

public function get printableHeader():PrintableHeader{

return this._header;

}

public function setprintableHeader(header:PrintableHeader):void{

this._header = header;

}

}

4、PrintableHeader、PrintableBody、PrintableFooter代码


<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">

<fx:Declarations>

<!-- 将非可视元素(例如服务、值对象)放在此处 -->

</fx:Declarations>

<s:Rect width="100%" height="100%">

<s:fill><s:SolidColor color="0xFF4500" /></s:fill>

</s:Rect>

<fx:Script>

<![CDATA[

/**

*[firstpage,perpage]<br/>

*firstpage,header区域只在第一页打印<br/>

*perpage,header区域每页都会打印

*/

public var printType:String = "firstpage";

public static const PRINTTYPE_FIRSTPAGE:String ="firstpage";

public static const PRINTTYPE_PERPAGE:String = "perpage";

]]>

</fx:Script>

</s:Group>

Body:

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="500">

<fx:Declarations>

<!-- 将非可视元素(例如服务、值对象)放在此处 -->

</fx:Declarations>

<fx:Script>

<![CDATA[

import mx.printing.PrintAdvancedDataGrid;

public var printGrid:PrintAdvancedDataGrid;

]]>

</fx:Script>

</s:Group>

Footer:

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">

<fx:Declarations>

<!-- 将非可视元素(例如服务、值对象)放在此处 -->

</fx:Declarations>

<s:Rect width="100%" height="100%">

<s:fill><s:SolidColor color="0xFF00ff" /></s:fill>

</s:Rect>

<fx:Script>

<![CDATA[

/**

*[lastpage,perpage]<br/>

*lastpage,footer区域只在最后一页打印<br/>

*perpage,footer区域每页都会打印

*/

public var printType:String = "lastpage";

public static const PRINTTYPE_LASTPAGE:String = "lastpage";

public static const PRINTTYPE_PERPAGE:String = "perpage";

]]>

</fx:Script>

</s:Group>

时间: 2024-10-07 06:46:59

Flex 自定义打印控件编写的相关文章

Android实现图片轮显效果——自定义ViewPager控件

一.问题概述 使用ViewPager控件实现可横向翻页.水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切换,所以实现图片轮显步骤如下: 1.  扩展ViewPager自定义一个MyScrollImageView类 2.  为MyScrollImageView定义适配器,装载图片信息 3.  定义图片滑动动画时间控制类 接下来我们就一步步实现下图案例: 二.实现套路 1.为自定义ViewPager控件编

网页WEB打印控件制作-开放源码

在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的一件事件,本文将自己开发编写的C# 制作的HTML打印插件分享出来,让有同样需求的朋友提供一个参考:此插件是基于Microsoft .NET Framework 2.0 开发的,缺点是每台客户端在安装插件时,必须要安装Microsoft .NET Framework 2.0 :本插件能实现 页眉.页脚.表头.标题.表尾的分

网页WEB打印控件制作 开放源码可以调试

在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的一件事件,本文将自己开发编写的C# 制作的HTML打印插件分享出来,让有同样需求的朋友提供一个参考:此插件是基于Microsoft .NET Framework 2.0 开发的,缺点是每台客户端在安装插件时,必须要安装Microsoft .NET Framework 2.0 :本插件能实现 页眉.页脚.表头.标题.表尾的分

网页WEB打印控件制作

在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的一件事件,本文将自己开发编写的C# 制作的HTML打印插件分享出来,让有同样需求的朋友提供一个参考:此插件是基于Microsoft .NET Framework 2.0 开发的,缺点是每台客户端在安装插件时,必须要安装Microsoft .NET Framework 2.0 :本插件能实现 页眉.页脚.表头.标题.表尾的分

分享免费的web打印控件puzu

在WEB系统中,打印的确是个烦人的问题----特别是你的应用环境又有很多种类的打印机.如果自己开发打印控件,可能因为项目时间紧而来不及.前段时间有机会接触了一下WEB打印.在博客园.CSDN以及各个论坛上找了老半天,终于顺利的完成了公司项目.现在就结合我的应用体验,将市面上的所有的免费打印控件为大家做一个介绍. 1. DLPrinter 这个打印控件完全免费,界面还不错,使用也较为简单,支持打印预览.直接打印.可设置页眉.页脚.页边距.打印份数.纸张大小等信息,悲剧的是这大哥在07年做了第二次更

WEB免费打印控件推荐

本人转载:http://www.cnblogs.com/panshenglu/archive/2009/09/21/1571258.html 在WEB系统中,打印的确是个烦人的问题. 要么自己开发打印控件,如果项目时间紧,肯定来不及. 要么购买成熟的打印控件,如果是大项目可以考虑,但如果项目只有几K到1.2W之间,这就麻烦了. 前段时间有机会接触了一下WEB打印.在博客园.CSDN上找了老半天,终于,功夫不付有心人,终于找到了. 现在就推荐给大家分享. 1.  DLPrinter DLPrint

【C#基础】CSA控件编写秘籍

新建CSA控件 1.新建一个纯类,命名空间是: namespace SimPerfect.CSAControlLibrary.CSAControls 2.实现两个构造函数:无参和传Candy参数 public CDealProcess() { InitMe(); } public CDealProcess(Candy parentCandy) { this.ParentCandy = parentCandy; InitMe(); } 3.编写InitMe()方法初始化控件属性: private

Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装为面向对象的类,而并非讨论如何继承自SDK提供的控件类(比如TextView),对其进行自定义扩展的问题. 进入正题前,我们先来看一组功能需求 假设在手机需求上,那么如上三个界面我们可以使用三个Activity,每个Activity一个布局文件,实现起来比较独立,但是假设在Android pad上要

对于四方web打印控件的看法

web打印控件比较多,但是基本都收费.但是四方的虽然不收费,就是得动动手了. 要谈到控件的实用性,便捷性,当然四方的会更胜一筹.在它的demo例子中,像设置默认打印机,纸张自定义大小,页眉页脚,页边距,连续打印等功能都可以轻松的实现. 对于那些需要web打印功能,但囊中羞涩,或者小范围使用,盈利未知的创业项目是比较实用的.如果要正真能够顺畅的使用,随心所欲,付费也是投资成本不可避免的了. 四方web打印控件,使用于IE作为客户端的所有应用,与服务器端开发语言无关,即PAZU支持所有的开发语言开发