如何使用通过PHP在BIRT上创建报表

时间:2019-04-16 23:59:04  来源:igfitidea点击:

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 也可以。

birt

通过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;
?>