Como Integrar Relatório Jasper com o Scriptcase

Standard

Segue um passo a passo de como: Integrar os relatórios jasper com Scriptcase:
• Testado com: PHP Version 5.3.5 (Xampp 1.7.4) / Tomcat 6.0 / Mysql, SqlServer
• Instalar pacotes para utilizacao de web-services (atraves do pear)

$pear install SOAP-0.12.0
$pear install Net_DIME-1.0.2
• Como instalar e configurar o Jasper Reports:
1-Instalar Jasper Server
2-Incluir .jar do conector jtds na lib do Tomcat
3-Adicionar novo Datasource:
driver = net.sourceforge.jtds.jdbc.Driver
url/user/pass = banco
4-Inserir novos relatorios apontando para o Datasource criadoAbaixo você segue o código para chamar o relatório (Utilizar este código em uma aplicação do tipo Blank):
<?php
// PHP client for requesting reports from JasperServer via SOAP.
//USAGE:
$jasper_url = "http://localhost:8081/jasperserver/services/repository";
$jasper_username = "jasperadmin";
$jasper_password = 'jasperadmin';
$client = new JasperClient($jasper_url, $jasper_username, $jasper_password);
/* Nome do arquivo do relatório importado para o jasper server */
$report_unit = "/reports/relatorio";
/* Formato de exportaçao do relatório */
$report_format = "PDF";
/* Parâmetos que são passados para o relatório, caso seja mais de um separar por vírgulas */
$report_params = array('id_plano_curso' => 4); 
$result = $client->requestReport($report_unit, $report_format,$report_params); 
header('Content-type: application/pdf');
echo $result;
 
 
/* Essa classe (abaixo) você pode colocar numa biblioteca no Scriptcase e só marcar nas aplicações que você for usar */
class JasperClient {
  private $url;
  private $username;
  private $password;
  
  public function __construct($url, $username, $password) {
    $this->url = $url;
    $this->username = $username;
    $this->password = $password;
  }
  
  public function requestReport($report, $format, $params) {
    $params_xml = "";
    foreach ($params as $name => $value) {
      $params_xml .= "<parameter name=\"$name\"><![CDATA[$value]]></parameter>\n";
    }
    
    $request = "
      <request operationName=\"runReport\" locale=\"pt_BR\">
        <argument name=\"RUN_OUTPUT_FORMAT\">$format</argument>
        <resourceDescriptor name=\"\" wsType=\"\"
        uriString=\"$report\"
        isNew=\"false\">
        <label>null</label>
        $params_xml
        </resourceDescriptor>
      </request>
    ";
    
    $client = new SoapClient(null, array(
        'location'  => $this->url,
        'uri'       => 'urn:',
        'login'     => $this->username,
        'password'  => $this->password,
        'trace'    => 1,
        'exception'=> 1,
        'soap_version'  => SOAP_1_1,
        'style'    => SOAP_RPC,
        'use'      => SOAP_LITERAL
 
      ));
 
    $pdf = null;
    try {
      $result = $client->__soapCall('runReport', array(
        new SoapParam($request,"requestXmlString") 
      ));
      
      $pdf = $this->parseReponseWithReportData(
        $client->__getLastResponseHeaders(),
        $client->__getLastResponse());
    } catch(SoapFault $exception) {
      $responseHeaders = $client->__getLastResponseHeaders();
      if ($exception->faultstring == "looks like we got no XML document" &&
          strpos($responseHeaders, "Content-Type: multipart/related;") !== false) {
        $pdf = $this->parseReponseWithReportData($responseHeaders, $client->__getLastResponse());
      } else {
        throw $exception;
      }
    }
    
    if ($pdf)
      return $pdf;
    else
      throw new Exception("Jasper did not return PDF data. Instead got: \n$pdf");
  }
  
  protected function parseReponseWithReportData($responseHeaders, $responseBody) {
    preg_match('/boundary="(.*?)"/', $responseHeaders, $matches);
    $boundary = $matches[1];
    $parts = explode($boundary, $responseBody);
      
    $pdf = null;
    foreach($parts as $part) {
      if (strpos($part, "Content-Type: application/pdf") !== false) {
        $pdf = substr($part, strpos($part, '%PDF-'));
        break;
      }
    }
    
    return $pdf;
  }
 
}