`
llitllie
  • 浏览: 7585 次
文章分类
社区版块
存档分类
最新评论

JasperReports flash 4.0.0打印功能实现

阅读更多

JasperReports是一个基于Java的开源报表工具,可以在ireport中进行设计后,输出HTML,PDF,Excell,OpenOffice和Word格式。JasperReports支持applet方式打印,但是flash方式却是注释掉的。在net\sf\jasperreports\flex\view\Viewer.mxml文件中

<!--
<mx:Button width="22" toolTip="Print Report" id="btnPrintReport0"
  buttonMode="true"enabled="false" >
    <mx:icon>@Embed(source='images/print.GIF')</mx:icon>
</mx:Button>
<mx:Button width="22" toolTip="Print Report" id="btnReload"
  buttonMode="true"  enabled="true" click="btnReloadClick()">
    <mx:icon>@Embed(source='images/reload.GIF')</mx:icon>
</mx:Button>
 -->
 

本文主要完成JasperReports的flash打印功能,是基于JasperReports Flash Viewer 4.0.0修改,参考了网络上基于3.0版本的修改。将Viewer.mxml文件上面的文字修改为

<mx:Button width="22" toolTip="Print Report" id="btnPrintReport0"
  buttonMode="true" enabled="false" click="btnPrintReport()">
   <mx:icon>@Embed(source='images/print.GIF')</mx:icon>
</mx:Button>
<!--
<mx:Button width="22" toolTip="Print Report" id="btnReload"
  buttonMode="true" enabled="true" click="btnReloadClick()">
    <mx:icon>@Embed(source='images/reload.GIF')</mx:icon>
</mx:Button>
-->
 

在Viewer.mxml中找到refreshPage函数,启用打印按钮,将

if (report.pageCount > 0)
{
    var pageCanvas:PageCanvas = new  PageCanvas(report.pages[pageIndex]);
    pageCanvas.scaleX = zoomRatio;
    pageCanvas.scaleY = zoomRatio;

    pageBox.visible = false;
    pageBox.removeAllChildren();
    pageBox.addChild(pageCanvas);
    pageBox.visible = true;
}
 

修改为

if (report.pageCount > 0)
{
    var pageCanvas:PageCanvas = new  PageCanvas(report.pages[pageIndex]);
    pageCanvas.scaleX = zoomRatio;
    pageCanvas.scaleY = zoomRatio;

    pageBox.visible = false;
    pageBox.removeAllChildren();
    pageBox.addChild(pageCanvas);
    pageBox.visible = true;
    btnPrintReport0.enabled = true;
}
 

在Viewer.mxml中引入net\sf\jasperreports\flex\view\PrintMananger.as文件,以支持打印

 
import net.sf.jasperreports.flex.view.PrintManager;

 

在Viewer.mxml增加打印函数btnPrintReport

public function  btnPrintReport():void
{
    PrintManager.printAll(jrpxmlUrl,pageFetchSize,report);
}
 

net\sf\jasperreports\flex\view\PrintMananger.as文件内容

 
package net.sf.jasperreports.flex.view
{
	import flash.events.EventDispatcher;
	import flash.events.SecurityErrorEvent;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import mx.core.UIComponent;
	import mx.collections.IList;
	import mx.collections.ArrayCollection;
	import net.sf.jasperreports.flex.view.PageCanvas;
	import net.sf.jasperreports.flex.model.Report;
	import net.sf.jasperreports.flex.xml.ReportFactory;
	import flash.events.HTTPStatusEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.events.IOErrorEvent;
	import mx.printing.FlexPrintJobScaleType;
	import mx.printing.FlexPrintJob;
	import mx.core.Application;
	import mx.containers.VBox;
	import mx.events.FlexEvent;

	public class PrintManager extends EventDispatcher
	{
		private var url:String;
                private var urlLoader:URLLoader;
		private var report:Report;
		private var pageIndex:int = 0;
		private var pageFetchSize:int = 1;

		private var componentsToBeInitialized:int = 0;
		private var pagesPrint:Array = [];

                public const LOAD_PAGE:String="loadPage";
                public const ALL_PAGE:String = "allPageLoader";

		public function PrintManager(){
            super();
        }

		public function get url():String
        {
            return url;
        }

        public function set url(value:String):void
        {
            url=value;
        }
		public function set fetchSize(fetchSize:int):void
		{
			pageFetchSize = fetchSize;
		}
        public static function printAll(url:String,fetchSize:int,report:Report):void
        {
            var pm:PrintManager = new PrintManager();
            pm.url = url;
			pm.pageFetchSize = fetchSize;
			pm.report = report;
            pm.loadAll();
        }
        private function loadAll():void
        {
            this.addEventListener(LOAD_PAGE, onLoadPage);
            this.addEventListener(ALL_PAGE, onAllPageLoaded);
			pageIndex=0;

			if (report)
			{
				var loadFlag:Boolean=false;
				while (pageIndex < report.pageCount) {
					if (!report.pages[pageIndex]) {
						loadFlag=true;
						break;
					}
					pageIndex++;
				}
			}

			if (loadFlag) {
				loadPage();
			}
            else{
                removeEventListener(LOAD_PAGE, onLoadPage);
                dispatchEvent(new Event(ALL_PAGE));
            }
        }

        private function onLoadPage(e:Event):void
        {
            pageIndex++;
            if (pageIndex < report.pageCount) {
				if(!report.pages[pageIndex]){
					loadPage();
				}
			}
            else{
                removeEventListener(LOAD_PAGE, onLoadPage);
                dispatchEvent(new Event(ALL_PAGE));
            }
        }

		public function  onAllPageLoaded(event:Event):void
		{
			var cur:int;
			var uc:UIComponent;
			var pj:*;
			if (report != null){
				pj = new FlexPrintJob();
				pj.printAsBitmap = false;
				if (pj.start()){
					cur = 0;
					while (cur < report.pageCount) {
						uc = processPage(new PageCanvas(report.pages[cur]));
						Application.application.addChild(uc);
						pj.addObject(uc);
						Application.application.removeChild(uc);
						cur++;
					};
					pj.send();
				};
			} else {

			};
		}
		private function processPage(param1:PageCanvas):UIComponent{
			var vbox:* = new VBox();
			vbox.horizontalScrollPolicy = "off";
			vbox.verticalScrollPolicy = "off";
			vbox.width = report.pageWidth;
			vbox.height = report.pageHeight;
			vbox.setStyle("backgroundColor", "#FFFFFF");
			vbox.addChild(param1);
			return (vbox);
		}

        private function loadPage():void
        {
            urlLoader=new URLLoader();
            urlLoader.addEventListener(Event.COMPLETE, completeHandler);
            urlLoader.addEventListener(Event.OPEN, openHandler);
            urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			if (report)
			{
				var goRight:Boolean = true;
				var goLeft:Boolean = true;
				var right:int = 0;
				var left:int = 0;

				while(goRight || goLeft)
				{
					if (
						goRight
						&& left + right + 1 < pageFetchSize
						&& pageIndex + right + 1  < report.pageCount
						&& !report.pages[pageIndex + right + 1]
						)
					{
						right++;
					}
					else
					{
						goRight = false;
					}

					if (
						goLeft
						&& left + right + 1 < pageFetchSize
						&& pageIndex - left - 1 >= 0
						&& !report.pages[pageIndex - left - 1]
						)
					{
						left++;
					}
					else
					{
						goLeft = false;
					}
				}

				urlLoader.load(new URLRequest(url + "&startPage=" + (pageIndex - left) + "&endPage=" + (pageIndex + right)));
			}
			else
			{
				//first load; pageIndex == 0
				urlLoader.load(new URLRequest(url + "&page=" + pageIndex));
			}
        }

        private function completeHandler(event:Event):void
        {
			var newReport:Report = ReportFactory.create(XML(urlLoader.data));

			var i:int;
			var pages:IList;

			if (report)
			{
				pages = report.pages;
			}
			else
			{
				//first load
				report = newReport;
				pages = new ArrayCollection(new Array(report.pageCount));
			}

			for(i = newReport.startPageIndex; i <= newReport.endPageIndex; i++)
			{
				pages[i] = newReport.pages[i - newReport.startPageIndex];
			}

			report.pages = pages;

			report.startPageIndex = Math.min(report.startPageIndex, newReport.startPageIndex);
			report.endPageIndex = Math.max(report.endPageIndex, newReport.endPageIndex);

			refreshPage();
        }
		private function openHandler(event:Event):void
		{
			trace("openHandler: " + event);
		}

		private function progressHandler(event:ProgressEvent):void
		{
			trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
		}

		private function securityErrorHandler(event:SecurityErrorEvent):void
		{
			trace("securityErrorHandler: " + event);
		}

		private function httpStatusHandler(event:HTTPStatusEvent):void
		{
			trace("httpStatusHandler: " + event);
		}

		private function ioErrorHandler(event:IOErrorEvent):void
		{
			trace("ioErrorHandler: " + event);
		}

        private function refreshPage():void
        {
			if (report) {
				this.dispatchEvent(new Event(this.LOAD_PAGE));
			}
        }
	}
}

 

编译Main.mxml运行,即实现打印功能,但是包含图片的打印依然打印不出来。对于这种动态图片的打印添加了等待事件完成,仍能无效,不知道有没有好的实现。
参考链接:
JasperReports Library
完成Flex报表设计、生成、打印功能
Flex 4 Printing Problem with dynamic components

 

个人博客原文链接:JasperReports flash打印实现

分享到:
评论

相关推荐

    jasperreports-flash 4.0.0web多页打印及其预览

    jasperreports-flash来实现web客户端打印的功能,避免了applet客户端打印在客户端安装jre的限制。jasperreports-flash只需要求客户端有能浏览swf文件的flash player就行了。可以根据自己的需求修改example.mxml文件...

    jasperreports-flash 3.7.0web多页打印及其预览

    jasperreports-flash来实现web客户端打印的功能,避免了applet客户端打印在客户端安装jre的限制。jasperreports-flash只需要求客户端有能浏览swf文件的flash player就行了。可以根据自己的需求修改example.mxml文件...

    jasperreports-flash.4.0

    基于jasperreport开发的flash查看器ver4.0

    IReport+jasperReports实现flash报表查询功能

    本篇文章将深入探讨如何利用这两款工具实现Flash报表查询功能。 首先,IReport是一款基于Java的报表设计工具,它可以与JasperReports库紧密结合,提供可视化的报表设计界面。用户可以通过拖拽字段、设置样式和排版...

    jasperreports-flash.3.7

    基于JasperReport的Flash查看器,Ver3.7

    JasperReports -- 客户端打印(WEB网页打印)

    总的来说,JasperReports客户端打印功能使得Web应用能够提供无缝的打印体验,用户可以直接在浏览器中查看和打印报表,极大地提高了用户体验。然而,随着现代浏览器对Java Applet的支持逐渐减少,开发者可能需要考虑...

    jasperreports flash 改写

    更改了jasperreports flash的官方版,实现打印,pdf,excel,word的导出,添加了打印后的回调执行,基本问题都已经处理, &lt;param name="movie" value="flash_pb.swf?jrpxml=servlets/xml?&lt;%=parm%&gt;&PRINT_ALL=all&...

    jasperreports-5.6.0+applet实现客户端打印所需的jar包

    在本场景中,我们关注的是JasperReports 5.6.0版本与Java Applet结合来实现客户端打印的功能。Applet是Java的一个古老特性,允许在Web浏览器中运行小型Java程序,为用户提供交互性。 首先,`jasperreports-5.6.0`是...

    jasperreports-applet-4.0.2.jar

    jasperreports-applet-4.0.2.jar

    japser实现批量打印

    本实例将详细介绍如何利用iReport和JasperReports来实现批量打印的功能。 首先,我们需要理解JasperReports的基本工作流程。JasperReport的设计是基于一个名为`.jrxml`的XML文件,这个文件包含了报表的所有布局和...

    jasperreports打印word格式报表的问题

    标题 "jasperreports打印word格式报表的问题" 涉及的是使用JasperReports库生成并打印Word(.doc或.docx)格式报表时遇到的技术挑战。JasperReports是一款开源Java库,它允许开发者创建、设计和导出各种类型的报告,...

    官网最新jasperreports.jar包下载

    整个大包总共有67M,小弟只能上传20M的东东,所以只传了常用的jasperreports-4.0.1.jar 、jasperreports-applet-4.0.1.jar 、jasperreports-javaflow-4.0.1.jar、jasperreports-fonts-4.0.1.jar 这四个包,总共...

    实现客户端打印之jasperrport3.7.0(打印预览+多页同时打印)

    标题中的“实现客户端打印之jasperrport3.7.0”指的是使用JasperReports的Portlet版本3.7.0来实现在客户端的打印功能,包括打印预览和多页同时打印。JasperReports是一个开源的Java报表库,它能够帮助开发者创建、...

    JasperReports webapp应用

    - **Flex API**: 通过Flex API,JasperReports可以与Flash进行深度集成,将报表数据转换为Flash可理解的格式,从而在Flash组件中展示。 4. **项目结构分析** - **.classpath**: Eclipse项目的类路径配置文件,...

    struts2基于jasperreports多报表同时打印插件

    基于struts2-jasperreports-plugin-2.3.1.2改写的插件,在原有功能的基础上又添加了多报表同时打印的功能。建议没用过struts2-jasperreports插件的先学习怎么使用这个插件。配的文档只对添加的功能的使用方法做了...

    jasperreports-applet-5.1.0.jar

    总结,JasperReports Applet 5.1.0是JasperReports在Web环境下的一种创新尝试,它通过applet技术实现了报表的在线打印,为开发者提供了更灵活的报表展示方案。理解并掌握这个特性,有助于提升Web应用的报表功能,为...

    jasperreports+alivepdf+Flex解决打印和导出PDF问题

    5. **打印功能**:利用Flex的printJob类,可以实现在客户端直接打印PDF,用户无需先下载文件。需要注意的是,打印前需要设置好打印机和打印参数。 6. **优化性能**:对于大数据量的报表,可能需要考虑分页、异步...

    开源报表打印组件JasperReports用法详解

    JasperReports是一款功能强大的开源报表打印组件,属于开源代码组织SourceForge.net中的一个Java报表打印项目。它能够生成多种格式的报表,包括PDF、HTML、XML等,并且支持分页打印,非常适合制作各种类型的数据图表...

    jasperreports

    本文将详细探讨JasperReports 4.7.0版本的核心特性、设计原理及其实现方法,旨在帮助开发者深入理解并充分利用这一强大的报告生成库。 1. **JasperReports概述** JasperReports是一个用Java编写的库,它允许开发者...

Global site tag (gtag.js) - Google Analytics