soluble / jasper
Jasper reports for PHP
1.0.0
2019-05-27 15:49 UTC
Requires
- php: ^7.1
- psr/http-message: ^1.0.1
- psr/log: ^1.0
- soluble/japha: ^2.5.1
- zendframework/zend-diactoros: ^1.6 || ^2.0
Requires (Dev)
- fig/http-message-util: ^1.1.2
- friendsofphp/php-cs-fixer: ^2.13
- guzzlehttp/guzzle: ^6.2.3
- infection/infection: ^0.13
- mikey179/vfsstream: ^1.6
- monolog/monolog: ^1.23.0
- phpstan/phpstan: ^0.11
- phpstan/phpstan-phpunit: ^0.11
- phpstan/phpstan-strict-rules: ^0.11
- phpunit/phpunit: ^7.5 | ^8.1
- psr/container: ^1.0
- roave/security-advisories: dev-master
- smalot/pdfparser: ^0.14
- zendframework/zend-servicemanager: ^3.3
Suggests
- monolog/monolog: PSR-3 compatible logger
- zendframework/zend-diactoros: PSR-7 message interfaces implementation
README
使用 Jasper reports 生成 PHP 的 PDF 报告。
文档: https://belgattitude.github.io/soluble-jasper
特性
- PDF 报告生成(其他格式可支持,请提 issue)
- JDBC、JSON 和 XML 数据源(URL 或文件系统)
- 支持 PSR-7 响应(流)
要求
- PHP 7.1+
- PHPJasperBridge(见安装)
- Java
依赖项
- soluble-japha 客户端,用于与 Jasper bridge 通信
示例
创建一个新的报告
<?php declare(strict_types=1); use Soluble\Japha\Bridge\Adapter as JavaBridgeAdapter; use Soluble\Jasper\{ReportRunnerFactory, Report, ReportParams}; use Soluble\Jasper\DataSource\JavaSqlConnection; use Soluble\Jasper\Exporter\PDFExporter; // Step 1: Get the report runner // Good practice is to initialize once and get it from a PSR-11 compatible container $bridgeAdapter = new JavaBridgeAdapter([ 'servlet_address' => 'localhost:8080/JasperReports/servlet.phpjavabridge' ]); $reportRunner = ReportRunnerFactory::getBridgedReportRunner($bridgeAdapter); // Step 2: Define your report parameters $report = new Report( '/path/my_report.jrxml', new ReportParams([ 'BookTitle' => 'Soluble Jasper', 'BookSubTitle' => 'Generated on JVM with Jasper reports' ]), new JavaSqlConnection( 'jdbc:mysql:///my_db?user=user&password=password', 'com.mysql.jdbc.Driver' ) ); // Step 3: Export the report $pdfExporter = new PDFExporter($report, $reportRunner); $pdfExporter->saveFile('/path/my_report_output.pdf', [ 'author' => 'John Doe', 'title' => 'My document' ]); // Or for PSR7 response $response = $pdfExporter->getPsr7Response([ 'author' => 'John Doe', 'title' => 'My document' ]); //$exportManager = $reportRunner->getExportManager($report); //$exportManager->savePdf('/path/my_report_output.pdf'); /* $pdfExporter = $exportManager->getPdfExporter(); $pdfExporter->saveFile('/path/my_report_output.pdf'); // Both will need to cache the report $psr7Response = $pdfExporter->getPsr7Response(); $stream = $pdfExporter->getStream(); */
数据源
Jasper reports 支持多个数据源来填充报告(见 JRApi)
JavaSqlConnection
使用 JavaSqlConnection
的示例
<?php declare(strict_types=1); use Soluble\Jasper\DataSource\JavaSqlConnection; $dataSource = new JavaSqlConnection( 'jdbc:mysql://server_host/database?user=user&password=password', 'com.mysql.jdbc.Driver' );
!!! 提示 为了方便,您还可以使用 JdbcDsnFactory
来转换数据库参数。
```php
<?php declare(strict_types=1);
use Soluble\Jasper\DataSource\Util\JdbcDsnFactory;
$dbParams = [
'driver' => 'mysql', // JDBC driver key.
'host' => 'localhost',
'db' => 'my_db',
'user' => 'user',
'password' => 'password',
// Optional extended options
'driverOptions' => [
'serverTimezone' => 'UTC'
]
];
$dsn = JdbcDsnFactory::createDsnFromParams($dbParams);
// You should get a jdbc formatted dsn:
// 'jdbc:mysql:///my_db?user=user&password=password&serverTimezone=UTC'
// ready to use as $dsn argument for `JdbcDataSource`
```
JsonDataSource
使用 JsonDataSource
的示例
<?php declare(strict_types=1); use Soluble\Jasper\{ReportRunnerFactory, Report, ReportParams}; use Soluble\Jasper\DataSource\JsonDataSource; $jsonDataSource = new JsonDataSource('<url_or_path>/northwind.json'); /* $jsonDataSource->setOptions([ JsonDataSource::PARAM_JSON_DATE_PATTERN => 'yyyy-MM-dd', JsonDataSource::PARAM_JSON_NUMBER_PATTERN => '#,##0.##', JsonDataSource::PARAM_JSON_TIMEZONE_ID => 'Europe/Brussels', JsonDataSource::PARAM_JSON_LOCALE_CODE => 'en_US' ]); */ $report = new Report( '/path/myreport.jrxml', new ReportParams([ 'LOGO_FILE' => '/path/assets/wave.png', 'TITLE' => 'My Title' ]), $jsonDataSource); $reportRunner = ReportRunnerFactory::getBridgedReportRunner($this->ba); $exportManager = $reportRunner->getExportManager($report); $exportManager->savePdf('/path/my_output.pdf');
XmlDataSource
使用 XmlDataSource
的示例
<?php declare(strict_types=1); use Soluble\Jasper\{ReportRunnerFactory, Report, ReportParams}; use Soluble\Jasper\DataSource\XmlDataSource; $xmlDataSource = new XmlDataSource('<url_or_path>/northwind.xml'); /* $xmlDataSource->setOptions([ XmlDataSource::PARAM_XML_DATE_PATTERN => 'yyyy-MM-dd', XmlDataSource::PARAM_XML_NUMBER_PATTERN => '#,##0.##', XmlDataSource::PARAM_XML_TIMEZONE_ID => 'Europe/Brussels', XmlDataSource::PARAM_XML_LOCALE_CODE => 'en_US' ]); */ $report = new Report( '/path/myreport.jrxml', new ReportParams([ 'LOGO_FILE' => '/path/assets/wave.png', 'TITLE' => 'My Title' ]), $xmlDataSource); $reportRunner = ReportRunnerFactory::getBridgedReportRunner($this->ba); $exportManager = $reportRunner->getExportManager($report); $exportManager->savePdf('/path/my_output.pdf');
日志记录
您可以使用任何兼容 psr/log
的记录器。以下是一个使用 monolog 的基本示例
<?php use Soluble\Japha\Bridge\Adapter as JavaBridgeAdapter; use Soluble\Jasper\{ReportRunnerFactory, Report, ReportParams}; use Monolog\Logger; use Monolog\Handler\StreamHandler; $logger = new Logger('soluble-japha-logger'); $logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); $bridgeAdapter = new JavaBridgeAdapter([ 'servlet_address' => 'localhost:8080/JasperReports/servlet.phpjavabridge' ]); $reportRunner = ReportRunnerFactory::getBridgedReportRunner($bridgeAdapter, $logger); $report = new Report('/path/my_report.jrxml', new ReportParams()); // Any exception during report compilation, filling or exporting will // be logged ;)
异常
在运行或导出报告时,可能会抛出以下异常
通常在编译时间
在填充时间
安装
该项目需要一个在相同机器上运行的 java 服务器(或服务),该服务器将暴露 jasper API 以供 php 端使用(网络桥接)。
请参阅下面的安装示例或更复杂的文档。
JasperBridge
构建 war 文件
# Example based on php-java-bridge master $ git clone https://github.com/belgattitude/php-java-bridge.git $ cd php-java-bridge $ ./gradlew war -I init-scripts/init.jasperreports.gradle -I init-scripts/init.mysql.gradle
在 Tomcat 上部署(以 ubuntu 为例 sudo apt install tomcat8
)
$ sudo cp ./build/libs/JavaBridgeTemplate.war /var/lib/tomcat8/webapps/JasperReports.war
等待几秒钟,然后在浏览器中访问 https://:8080/JasperReports,您应该看到 php-java-bridge 控制台页面。
该桥接地址可用于 japha 桥接适配器中
<?php declare(strict_types=1); use Soluble\Japha\Bridge\Adapter; $ba = new Adapter([ 'driver' => 'Pjb62', 'servlet_address' => 'localhost:8080/JasperReports/servlet.phpjavabridge' ]); // This should print your JVM version echo $ba->javaClass('java.lang.System')->getProperty('java.version');
如果您遇到权限问题(例如,pdf 是由 tomcat8 用户创建的),只需将您的用户添加到 tomcat 组中即可
$ sudo usermod -a -G <tomcat group name> <username>
基准测试
常见操作的早期基准测试(目前运行在笔记本电脑上,不久将在 digitalocean 上进行)。见 tests/bench/simple_benchmarks.php
。
Jasper 编译时间和填充(内部)
PDF 导出
- 连接时间:3 毫秒