如何使用通过PHP在BIRT上创建报表
BIRT是一个Eclipse-based开放源代码报表系统。BIRT报表是一款非常流行的开源报表开发工具。它主要是用在基于Java与J2EE的Web应用程序上。
这里我们将在PHP Web站点上生成BIRT水晶报表。
由于Eclipse BIRT是基于java开发的,如果我们要在php中使用。那么就需要一个中介(中间件)。
我们将使用PHP/Java Bridge, 它用于将本地脚本语言(如PHP或Python)连接到Java服务(如Tomcat)。
环境要求
拥有Java运行环境和SDK,并且安装了tomcat.
软件安装
下载PHP/Java bridge
到http://php-java-bridge.sourceforge.net/pjb/download.php
, 选择Documentation 下载PHP/Java bridge。将JavaBridge.war放到tomcat\webapps目录中。
安装BIRT Runtime
下载地址http://download.eclipse.org/birt/downloads/
选择Latest BIRT runtime Release Build下的download now。 将WebViewerExample复制到 tomcat\webapps目录中,改名成birt-viewer
安装Commons Logging
下载地址http://commons.apache.org/logging/download_logging.cgi
。选择Binaries, version.zip。解压后将所有的.jar文件复制到 tomcat\webapps\birt-viewer\WEB-INF\lib目录中
现在需在Apache上创建一个新网站用于运行PHP程序。而tomcat是为Birt提供java运行环境。
启动apache。
启动tomcat。(假设端口是8080)
打开http://localhost:8080/
看tomcat是否正常
打开http://localhost:8080/JavaBridge
查看PHP/Java bridge是否正常。
PHP代码
使用PHP创建水晶报表有两种方式——一种是通过Birt查看器,另一种是直接通过JavaBridge。
通过Birt查看器
可以通过http来使用报表,有报告,打印、导出选项。但是,必须注意安全问题,因为报告的URL必须能够从web访问。
<?php // 1. 通过Http 进行请求 // 使用了BirtViewer提供的hello_world报告: $fname = "hello_world.rptdesign"; // 报告文件名 $topCount = 5; // Top Count 参数 $topPercentage = 25; // Top Percentage 参数 // Redirect browser $dest = "http://localhost:8081/birt-viewer/frameset?__report="; $dest .= urlencode( ( $fname ) ); $dest .= "&Top Count=" . urlencode( $topCount );//参数1 $dest .= "&Top Percentage=" . urlencode( $topPercentage );//参数2 header("location: ".$dest); ?>
我们直接使用浏览器打开 http://localhost:8080/birt-viewer/frameset?__report=hello_world.rptdesign 也可以。
通过Javabridge
可以直接访问文件(不需要通过http),因此呈现的是简单的HTML。但是,没有打印和导出选项。
<?php // 2. 使用BIRT运行时引擎读取本地文件 if (!(get_cfg_var('java.web_inf_dir'))) { define ("JAVA_HOSTS", "127.0.0.1:8081"); define ("JAVA_SERVLET", "../../tomcat/webapps/JavaBridge/JavaBridge.phpjavabridge"); } $pth = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"]; $path_parts = pathinfo($pth); $imageURLPrefix = $path_parts['dirname'] ."/images/"; require_once("../../tomcat/webapps/JavaBridge/java/Java.inc"); session_start(); $here = getcwd(); $ctx = java_context()->getServletContext(); $birtReportEngine = java("org.eclipse.birt.php.birtengine.BirtEngine")->getBirtEngine($ctx); java_context()->onShutdown(java("org.eclipse.birt.php.birtengine.BirtEngine")->getShutdownHook()); try{ $report = $birtReportEngine->openReportDesign("${here}/hello_world.rptdesign"); $task = $birtReportEngine->createRunAndRenderTask($report); $task->setParameterValue("Top Count", new java("java.lang.Integer", 6)); $task->setParameterValue("Top Count", new java("java.lang.Integer", 6)); $taskOptions = new java("org.eclipse.birt.report.engine.api.HTMLRenderOption"); $outputStream = new java("java.io.ByteArrayOutputStream"); $taskOptions->setOutputStream($outputStream); $taskOptions->setOutputFormat("html"); $ih = new java( "org.eclipse.birt.report.engine.api.HTMLServerImageHandler"); $taskOptions->setImageHandler($ih); $taskOptions->setEnableAgentStyleEngine(true); $taskOptions->setBaseImageURL($imageURLPrefix . session_id()); $taskOptions->setImageDirectory($here . "/images/" . session_id()); $task->setRenderOption( $taskOptions ); $task->run(); $task->close(); } catch (JavaException $e) { echo $e; //"Error Calling BIRT"; } echo $outputStream; ?>