dericktan / phpjasper
使用JasperReports在PHP中创建报告
Requires
- php: >=5.4.0
This package is auto-updated.
Last update: 2024-09-13 03:09:04 UTC
README
你的服务器使用Linux吗?
请务必为目录/vendor/dericktan/phpjasper/src/JasperStarter/bin和文件二进制文件jasperstarter授予权限777
##介绍
此软件包旨在成为编译和处理JasperReports (.jrxml & .jasper文件)的解决方案。
###为什么?
你有没有在伟大的Web应用程序中创建过带有许多字段的漂亮发票?
我必须这么做,而现有的解决方案都不完美。生成HTML + CSS来制作PDF?什么鬼?这没有任何意义! :)
然后我发现了JasperReports,这是最好的开源报告解决方案。
###我能用它做什么?
嗯,一切。JasperReports是报告和BI的强大工具。
从他们的网站
JasperReports库是全球最受欢迎的开源报告引擎。它完全用Java编写,能够使用来自任何类型数据源的数据,并生成像素完美的文档,可以查看、打印或导出为HTML、PDF、Excel、OpenOffice和Word等文档格式。
我建议使用Jaspersoft Studio来构建你的报告,连接到你的数据源(例如MySQL、POSTGRES),遍历结果并将输出到PDF、XLS、DOC、RTF、ODF等。
你可以做的示例
- 发票
- 报告
- 列表
通过JasperReports 6库和JasperStarter v3命令行工具生成报告的软件包。
##要求
- Java JDK 1.8
- PHP exec()函数
- [可选] Mysql Connector(如果你想使用数据库)
- [可选] PostgreSQL Connector(如果你想使用数据库)
- [可选] Jaspersoft Studio(绘制和编译你的报告)
##安装
###Java
检查你是否已经安装了Java
$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode, sharing)
如果你得到
command not found: java
那么用以下方法安装它(Ubuntu/Debian):
$ sudo apt-get install default-jdk
现在再次运行java -version
并检查输出是否正常。
##安装
如果你没有安装Composer,请安装它。
composer require dericktan/phpjasper
或者在你的'composer.json'文件中添加
{ "require": { "dericktan/phpjasper": "1.*" } }
然后只需运行
composer install
就完成了。
##示例
###Hello World示例。
转到存储库根目录中的示例目录(vendor/dericktan/phpjasper/examples
)。用iReport或你喜欢的文本编辑器打开hello_world.jrxml
文件,查看源代码。
编译
首先,我们需要将我们的JRXML
文件编译成一个JASPER
二进制文件。我们只需要做一次。
注意:如果你使用的是Jaspersoft Studio,则不需要执行此步骤。你可以在程序中直接编译。
require __DIR__ . '/vendor/autoload.php'; use JasperPHP\JasperPHP; $input = __DIR__ . '/vendor/dericktan/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/dericktan/phpjasper/examples/hello_world.jasper'; $output = __DIR__; $jasper = new JasperPHP; $jasper->process( $input, $output, array("pdf", "rtf") )->execute();
现在检查示例文件夹! :) 很不错,现在你有两个文件,hello_world.pdf
和 hello_world.rtf
。
查看 src/JasperPHP/JasperPHP.php
文件中 compile
和 process
函数的 API。
####列出参数
查询 Jasper 文件以检查给定 Jasper 报告文件中可用的参数
require __DIR__ . '/vendor/autoload.php'; use JasperPHP\JasperPHP; $input = __DIR__ . '/vendor/dericktan/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/dericktan/phpjasper/examples/hello_world.jrxml'; $output = __DIR__; $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', ) )->execute();
###在 Laravel 5.* 中使用 JasperPHP
- 如果你没有安装Composer,请安装它。
composer require dericktan/phpjasper
或者在你的'composer.json'文件中添加
{ "require": { "dericktan/phpjasper": "1.*" } }
-
然后只需运行
composer update
-
将以下内容添加到 config/app.php 的 providers 数组中
JasperPHP\JasperPHPServiceProvider::class,
-
在 /public 目录 上创建一个 /report 文件夹
-
将 /vendor/dericktan/phpjasper/examples 中的 hello_world.jrxml 文件复制到 /public/report 目录
-
运行 php artisan serve
-
访问 localhost:8000/reports
-
检查 /public/report 目录。现在你有三个文件,
hello_world.pdf
、hello_world.rtf
和hello_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() )->execute(); });
在此示例中,我们生成 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'; $jasper = new JasperPHP; $jasper->process( public_path() . '/report/CancelAck.jrxml', $output, array($ext), array(), array('data_file' => $data_file, 'driver' => $driver, 'xml_xpath' => $xml_xpath), false, false )->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); }
注意
要使用上面的示例,您必须将以下示例文件复制到文件夹中:
\vendor\dericktan\phpjasper\src\JasperStarter\examples\CancelAck.jrxml 和 \vendor\dericktan\phpjasper\src\JasperStarter\examples\CancelAck.xml 到文件夹: \public\report
###从 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'; $jasper = new JasperPHP; $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); }
###为导出的 PDF 设置密码 您现在可以轻松地为 PDF 文档设置密码
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'; $password = "jasper"; $jasper = new JasperPHP; $jasper->process( public_path() . '/report/json.jrxml', $output, array($ext), array(), array('data_file' => $data_file, 'driver' => $driver, 'json_query' => $json_query, null, null, $password )->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); }
注意
要使用上面的示例,您必须将以下示例文件复制到文件夹中:
\vendor\dericktan\phpjasper\src\JasperStarter\examples\CancelAck.jrxml 和 \vendor\dericktan\phpjasper\src\JasperStarter\examples\CancelAck.xml 到文件夹: \public\report
###MySQL
我们在 /src/JasperStarter/jdbc/
目录中提供了 MySQL 连接器(v5.1.34)。
###PostgreSQL
我们在 /src/JasperStarter/jdbc/
目录中提供了 PostgreSQL(v9.4-1203)。
##性能
取决于复杂性、数据量和机器资源(告诉我您的使用案例)。
我有一个生成带有数据库连接、图片和多页面的 发票 的报告,处理时间大约为 3/4 秒。我建议您使用工作进程在后台生成报告。
##感谢
感谢 Cenote GmbH 提供的 JasperStarter 工具。
##有问题?
通过 Skype [leandro.bittencourt16] 或电子邮件 [leandrocintrabitencourt@gmail.com] 联系我
通过 Skype [danielrodrigueslima] 或电子邮件 [danielrodrigues-ti@hotmail.com] 联系我
通过电子邮件 [derick.tan988@gmail.com] 联系我
##许可证
MIT