i4n/phpjasper

使用 JasperReports 在 PHP/Laravel 中创建报告

2.20 2018-01-10 02:21 UTC

This package is not auto-updated.

Last update: 2024-09-26 17:43:55 UTC


README

License Total Downloads

Linux 服务器注意

请确保为目录 /vendor/i4n/phpjasper/src/JasperStarter/bin 和二进制文件 jasperstarter 提供权限 777。

解决 Windows 字体问题 apt-get install ttf-mscorefonts-installer

## 简介 此包是编译和处理 Jasper 报告 (.jrxml & .jasper) 的最佳解决方案,无论是使用纯 PHP 还是通过 Laravel 框架。

### 为什么需要 PHPJasper?

您是否曾需要为您的 Web 系统创建一个复杂的 PHP 报告?

我需要过,所以我寻找了一些解决方案,大多数都是复杂的,并且您需要编写 HTML + CSS 来生成 PDF,这没有意义,而且非常耗时 :)

我向大家介绍 JasperReports,这是目前存在的最佳开源报告解决方案。

### 我可以用它做什么?

以下内容摘自 JasperSoft 网站

JasperReports 库是全球最受欢迎的开源报告生成机制。它完全用 Java 编写,能够使用来自任何类型数据源的数据,并生成可以在各种文档格式中查看、打印或导出的完美文档,包括 HTML、PDF、Excel、OpenOffice 和 Word。

您可以做到的事情示例

  • 发票
  • 报告
  • 列表

## 要求

### 关于 Java 的注意事项

通过运行以下命令检查 Java 是否已安装:

$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

如果您得到以下返回结果

command not found: java

在以下位置安装 java: (Ubuntu/Debian)

$ sudo apt-get install default-jdk

在以下位置安装: (centOS/Fedora)

# yum install java-1.8.0-openjdk.x86_64

对于 Windows,请点击链接-> JDK 并查找适用于您操作系统的正确版本。

再次运行 java -version 命令并检查输出是否正常。

## 安装

  1. 如果您还没有安装 Composer,请先安装它,然后运行以下命令:
composer require i4n/phpjasper

创建一个 'composer.json' 文件并写入以下代码:

{
    "require": {
        "i4n/phpjasper": "1.*"
    }
}

运行以下命令:

composer install

您已成功安装 PHPJasper。

## 示例

### Hello World 示例。

请转到仓库根目录下的示例目录 (vendor/i4n/phpjasper/examples)。使用 JasperStudio 或您的首选编辑器打开文件 hello_world.jrxml 并查看代码。

编译

首先,我们需要将扩展名为 .JRXML 的文件编译成一个二进制文件 .JASPER

注意:如果您不想使用 Jaspersoft Studio,可以通过以下方式编译您的 .jrxml 文件:

require __DIR__ . '/vendor/autoload.php';

use JasperPHP\JasperPHP;

$input = __DIR__ . '/vendor/i4n/phpjasper/examples/hello_world.jrxml';   

$jasper = new JasperPHP;
$jasper->compile($input)->execute();

以下命令将源文件 hello_world.jrxml 编译成文件 hello_world.jasper

#### 处理

现在我们来处理我们的报告

require __DIR__ . '/vendor/autoload.php';

use JasperPHP\JasperPHP;

$input = __DIR__ . '/vendor/i4n/phpjasper/examples/hello_world.jasper';  
$output = __DIR__ . '/vendor/i4n/phpjasper/examples';    

$jasper = new JasperPHP;

$jasper->process(
    $input,
    $output,
    array("pdf", "rtf")
)->execute();

现在查看examples文件夹! :) 做得怎么样?你有2个文件,hello_world.pdfhello_world.rtf

检查文件src/JasperPHP/JasperPHP.phpcompileprocess函数的API

####列出参数

查询jasper文件以检查报告中可用的参数

require __DIR__ . '/vendor/autoload.php';

use JasperPHP\JasperPHP;

$input = __DIR__ . '/vendor/i4n/phpjasper/examples/hello_world_params.jrxml';

$jasper = new JasperPHP;
$output = $jasper->list_parameters($input)->execute();

foreach($output as $parameter_description)
    print $parameter_description . '<pre>';

###从数据库生成报告

为您的数据库添加特定参数

require __DIR__ . '/vendor/autoload.php';

use JasperPHP\JasperPHP;    

$input = __DIR__ . '/vendor/i4n/phpjasper/examples/hello_world.jrxml';   
$output = __DIR__ . '/vendor/i4n/phpjasper/examples';    

$jasper = new JasperPHP;
$jasper->process(
    $input,
    $output,
    array("pdf", "rtf"),
    array("php_version" => phpversion()),
    array(
        'driver' => 'postgres',
        'username' => 'vagrant',
        'host' => 'localhost',
        'database' => 'samples',
        'port' => '5432',
    ), 'pt_BR' //locale                      
)->execute();

###在Laravel 5.*中使用JasperPHP

  1. 安装Composer
composer require i4n/phpjasper

创建一个'composer.json'文件

{
    "require": {
        "i4n/phpjasper": "1.*"
    }
}
  1. 运行

    composer update

  2. 在config/app.php的providers数组中添加provider

    JasperPHP\JasperPHPServiceProvider::class,

  3. /public directory中创建文件夹/report

  4. /vendor/i4n/phpjasper/examples中的hello_world.jrxml文件复制到/public/report

  5. 运行php artisan serve

  6. 访问localhost:8000/reports

  7. 检查文件夹/public/report。你有3个文件,hello_world.pdfhello_world.rtfhello_world.xml

将以下代码复制到您的route.php文件中

use JasperPHP\JasperPHP;

Route::get('/reports', function () {
    
    $output = public_path() . '/report/'.time().'_hello_world';
    $report = new JasperPHP;
    $report->process(
        public_path() . '/report/hello_world.jrxml', 
        $output, 
        array('pdf', 'rtf', 'xml'),
        array(),
        array(),
        'pt_BR' //locale  
        )->execute();
});

在这个例子中我们生成了3个文件:pdf,rtf和xml。

###在PHP/Laravel 5.*中从XML生成报告

看看如何从XML源轻松生成报告

use JasperPHP\JasperPHP;

public function xmlToPdf()
    {
        $output = public_path() . '/report/'.time().'_CancelAck';
        $ext = "pdf";
        $data_file = public_path() . '/report/CancelAck.xml';
        $driver = 'xml';
        $xml_xpath = '/CancelResponse/CancelResult/ID';
        
        $php_jasper = new JasperPHP;
        
        $php_jasper->process(
            public_path() . '/report/CancelAck.jrxml',
            $output,
            array($ext),
            array(),
            array('data_file' => $data_file, 'driver' => $driver, 'xml_xpath' => $xml_xpath))->execute();
    
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.time().'_CancelAck.'.$ext);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Content-Length: ' . filesize($output.'.'.$ext));
        flush();
        readfile($output.'.'.$ext);
        unlink($output.'.'.$ext);
    }

注意

为了使用上述示例,您需要在\public\report文件夹中添加位于以下位置的文件副本:

\vendor\i4n\phpjasper\examples\CancelAck.jrxml\vendor\i4n\phpjasper\examples\CancelAck.xml

###在PHP/Laravel 5.*中从JSON文件生成报告

看看如何从JSON源轻松生成报告

use JasperPHP\JasperPHP;

public function jsonToPdf()
    {
        $output = public_path() . '/report/'.time().'_Contacts';
        $ext = "pdf";
        $driver = 'json';
        $json_query= "contacts.person";
        $data_file = public_path() . '/report/contacts.json';
            
        $php_jasper = new JasperPHP;
        
        $php_jasper->process(
            public_path() . '/report/json.jrxml',
            $output,
            array($ext),
            array(),
            array('data_file' => $data_file, 'driver' => $driver, 'json_query' => $json_query))->execute();
    
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.time().'_Contacts.'.$ext);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Content-Length: ' . filesize($output.'.'.$ext));
        flush();
        readfile($output.'.'.$ext);
        unlink($output.'.'.$ext);
    }

注意

为了使用上述示例,您需要在\public\report文件夹中添加位于以下位置的文件副本:

\vendor\i4n\phpjasper\examples\json.jrxml\vendor\i4n\phpjasper\examples\contacts.json

###MySQL

我们在/src/JasperStarter/jdbc/文件夹中包含了MySQL connector (v5.1.39)

###PostgreSQL

我们在/src/JasperStarter/jdbc/文件夹中包含了PostgreSQL (v9.4-1203)

###MSSQL

Microsoft JDBC Drivers 6.0, 4.2, 4.1, and 4.0 for SQL Server.

##性能

根据报告的大小而变化

##感谢

感谢Cenote GmbHJasperStarter

感谢JetBrainsPhpStorm和所有优秀的解决方案。

##疑问?

打开一个问题,或搜索旧问题。

##许可证

MIT

##贡献

向PHP和Laravel社区贡献,欢迎fork!!!