{"id":15025765,"url":"https://github.com/belgattitude/soluble-jasper","last_synced_at":"2025-04-09T20:04:21.806Z","repository":{"id":57055353,"uuid":"100500930","full_name":"belgattitude/soluble-jasper","owner":"belgattitude","description":"Jasper report for PHP","archived":false,"fork":false,"pushed_at":"2019-06-27T15:39:28.000Z","size":2303,"stargazers_count":10,"open_issues_count":2,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-09T20:04:15.872Z","etag":null,"topics":["bridge","jasper","jasperreports","php71","soluble-japha"],"latest_commit_sha":null,"homepage":"https://belgattitude.github.io/soluble-jasper/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/belgattitude.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-16T14:54:52.000Z","updated_at":"2021-11-13T07:23:50.000Z","dependencies_parsed_at":"2022-08-24T14:00:21.391Z","dependency_job_id":null,"html_url":"https://github.com/belgattitude/soluble-jasper","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-jasper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-jasper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-jasper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belgattitude%2Fsoluble-jasper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/belgattitude","download_url":"https://codeload.github.com/belgattitude/soluble-jasper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248103865,"owners_count":21048245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bridge","jasper","jasperreports","php71","soluble-japha"],"created_at":"2024-09-24T20:02:58.812Z","updated_at":"2025-04-09T20:04:21.779Z","avatar_url":"https://github.com/belgattitude.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# soluble-jasper  \n\n[![PHP Version](http://img.shields.io/badge/php-7.1+-ff69b4.svg)](https://packagist.org/packages/soluble/jasper)\n[![Build Status](https://travis-ci.org/belgattitude/soluble-jasper.svg?branch=master)](https://travis-ci.org/belgattitude/soluble-jasper)\n[![codecov](https://codecov.io/gh/belgattitude/soluble-jasper/branch/master/graph/badge.svg)](https://codecov.io/gh/belgattitude/soluble-jasper)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/belgattitude/soluble-jasper/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/belgattitude/soluble-jasper/?branch=master)\n![PHPStan](https://img.shields.io/badge/style-level%207-brightgreen.svg?style=flat-square\u0026label=phpstan)\n[![Latest Stable Version](https://poser.pugx.org/soluble/jasper/v/stable.svg)](https://packagist.org/packages/soluble/jasper)\n[![Total Downloads](https://poser.pugx.org/soluble/jasper/downloads.png)](https://packagist.org/packages/soluble/jasper)\n[![License](https://poser.pugx.org/soluble/jasper/license.png)](https://packagist.org/packages/soluble/jasper)\n\nPDF report generation with jasper reports for PHP.\n\nDocs: [https://belgattitude.github.io/soluble-jasper](https://belgattitude.github.io/soluble-jasper)\n\n\n## Features\n\n- Report generation in PDF (other formats can be supported, open an issue) \n- Datasources for JDBC, JSON and XML (url or filesystem) \n- Support for PSR-7 responses (stream)\n\n## Requirements\n\n- PHP 7.1+\n- PHPJasperBridge (see install)\n- Java\n\n## Dependencies\n\n- [soluble-japha](https://github.com/belgattitude/soluble-japha) client for communication with the jasper bridge\n\n## Examples\n\n### Creating a new report\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Soluble\\Japha\\Bridge\\Adapter as JavaBridgeAdapter;\nuse Soluble\\Jasper\\{ReportRunnerFactory, Report, ReportParams};\nuse Soluble\\Jasper\\DataSource\\JavaSqlConnection;\nuse Soluble\\Jasper\\Exporter\\PDFExporter;\n\n\n// Step 1: Get the report runner\n// Good practice is to initialize once and get it from a PSR-11 compatible container\n\n$bridgeAdapter = new JavaBridgeAdapter([\n    'servlet_address' =\u003e 'localhost:8080/JasperReports/servlet.phpjavabridge'    \n]);\n\n$reportRunner = ReportRunnerFactory::getBridgedReportRunner($bridgeAdapter);\n\n// Step 2: Define your report parameters\n\n$report = new Report(\n     '/path/my_report.jrxml',\n     new ReportParams([\n            'BookTitle'    =\u003e 'Soluble Jasper',\n            'BookSubTitle' =\u003e 'Generated on JVM with Jasper reports'\n     ]),\n     new JavaSqlConnection(\n         'jdbc:mysql://localhost/my_db?user=user\u0026password=password',\n         'com.mysql.jdbc.Driver'\n     )\n);\n\n// Step 3: Export the report\n\n$pdfExporter = new PDFExporter($report, $reportRunner);\n\n$pdfExporter-\u003esaveFile('/path/my_report_output.pdf', [\n    'author' =\u003e 'John Doe',\n    'title' =\u003e 'My document'\n]);\n\n// Or for PSR7 response\n\n$response = $pdfExporter-\u003egetPsr7Response([\n    'author' =\u003e 'John Doe',\n    'title' =\u003e 'My document'    \n]);\n\n//$exportManager = $reportRunner-\u003egetExportManager($report);\n//$exportManager-\u003esavePdf('/path/my_report_output.pdf');\n\n\n/*\n$pdfExporter = $exportManager-\u003egetPdfExporter();\n$pdfExporter-\u003esaveFile('/path/my_report_output.pdf');\n\n// Both will need to cache the report \n$psr7Response = $pdfExporter-\u003egetPsr7Response();\n$stream       = $pdfExporter-\u003egetStream();\n*/\n\n```\n\n\n## Datasources\n\n\nJasper reports supports multiple datasources for filling the report (see [JRApi](http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperFillManager.html))\n\n### JavaSqlConnection\n\nExample using `JavaSqlConnection`:\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Soluble\\Jasper\\DataSource\\JavaSqlConnection;\n\n$dataSource = new JavaSqlConnection(\n     'jdbc:mysql://server_host/database?user=user\u0026password=password',\n     'com.mysql.jdbc.Driver'\n);\n```\n\n!!! tip\n    For convenience you can also use the `JdbcDsnFactory` to convert \n    database params. \n\n    ```php\n    \u003c?php declare(strict_types=1);\n    \n    use Soluble\\Jasper\\DataSource\\Util\\JdbcDsnFactory;\n    \n    $dbParams = [\n        'driver'    =\u003e 'mysql', // JDBC driver key.\n        'host'      =\u003e 'localhost',\n        'db'        =\u003e 'my_db',\n        'user'      =\u003e 'user',\n        'password'  =\u003e 'password',\n        // Optional extended options\n        'driverOptions'  =\u003e [\n            'serverTimezone' =\u003e 'UTC'\n        ]        \n    ];\n    \n    $dsn = JdbcDsnFactory::createDsnFromParams($dbParams);\n    \n    // You should get a jdbc formatted dsn:\n    //   'jdbc:mysql://localhost/my_db?user=user\u0026password=password\u0026serverTimezone=UTC'\n    // ready to use as $dsn argument for `JdbcDataSource`\n    ```\n\n### JsonDataSource\n\nExample using `JsonDataSource`:\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Soluble\\Jasper\\{ReportRunnerFactory, Report, ReportParams};\nuse Soluble\\Jasper\\DataSource\\JsonDataSource;\n \n$jsonDataSource = new JsonDataSource('\u003curl_or_path\u003e/northwind.json');\n/*\n$jsonDataSource-\u003esetOptions([\n    JsonDataSource::PARAM_JSON_DATE_PATTERN   =\u003e 'yyyy-MM-dd',\n    JsonDataSource::PARAM_JSON_NUMBER_PATTERN =\u003e '#,##0.##',\n    JsonDataSource::PARAM_JSON_TIMEZONE_ID    =\u003e 'Europe/Brussels',\n    JsonDataSource::PARAM_JSON_LOCALE_CODE    =\u003e 'en_US'\n]);\n*/\n\n$report = new Report(\n                '/path/myreport.jrxml',\n                new ReportParams([\n                    'LOGO_FILE' =\u003e '/path/assets/wave.png',\n                    'TITLE'     =\u003e 'My Title'            \n                ]),  \n                $jsonDataSource);\n\n$reportRunner = ReportRunnerFactory::getBridgedReportRunner($this-\u003eba);\n$exportManager = $reportRunner-\u003egetExportManager($report);\n\n$exportManager-\u003esavePdf('/path/my_output.pdf');\n\n```\n\n### XmlDataSource\n\nExample using `XmlDataSource`:\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Soluble\\Jasper\\{ReportRunnerFactory, Report, ReportParams};\nuse Soluble\\Jasper\\DataSource\\XmlDataSource;\n \n$xmlDataSource = new XmlDataSource('\u003curl_or_path\u003e/northwind.xml');\n/*\n$xmlDataSource-\u003esetOptions([\n    XmlDataSource::PARAM_XML_DATE_PATTERN   =\u003e 'yyyy-MM-dd',\n    XmlDataSource::PARAM_XML_NUMBER_PATTERN =\u003e '#,##0.##',\n    XmlDataSource::PARAM_XML_TIMEZONE_ID    =\u003e 'Europe/Brussels',\n    XmlDataSource::PARAM_XML_LOCALE_CODE    =\u003e 'en_US'\n]);\n*/\n\n$report = new Report(\n                '/path/myreport.jrxml',\n                new ReportParams([\n                    'LOGO_FILE' =\u003e '/path/assets/wave.png',\n                    'TITLE'     =\u003e 'My Title'            \n                ]),  \n                $xmlDataSource);\n\n$reportRunner = ReportRunnerFactory::getBridgedReportRunner($this-\u003eba);\n$exportManager = $reportRunner-\u003egetExportManager($report);\n\n$exportManager-\u003esavePdf('/path/my_output.pdf');\n\n```\n\n## Logging\n\nYou can enable any `psr/log` compatible logger. Here's a basic example with [monolog](https://github.com/Seldaek/monolog):\n\n```php\n\u003c?php\n\nuse Soluble\\Japha\\Bridge\\Adapter as JavaBridgeAdapter;\nuse Soluble\\Jasper\\{ReportRunnerFactory, Report, ReportParams};\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\n\n$logger = new Logger('soluble-japha-logger');\n$logger-\u003epushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));\n\n$bridgeAdapter = new JavaBridgeAdapter([\n    'servlet_address' =\u003e 'localhost:8080/JasperReports/servlet.phpjavabridge'    \n]);\n\n$reportRunner = ReportRunnerFactory::getBridgedReportRunner($bridgeAdapter, $logger);\n\n$report = new Report('/path/my_report.jrxml', new ReportParams());\n\n// Any exception during report compilation, filling or exporting will\n// be logged ;)\n\n```\n\n## Exceptions\n\nWhen running or exporting a report, the following exception can be thrown: \n\nGenerally at compile time:\n\n| Exception                       | Description                                                              |                    \n|---------------------------------|--------------------------------------------------------------------------|\n| `ReportFileNotFoundException`   | When the report file cannot be opened (PHP or Java side, check perms)    |\n| `BrokenXMLReportFileException`  | When the report JRXML file cannot be parsed (xml error)                  |\n| `ReportCompileException`        | Compilation error, generally an invalid expression or missing resource   |\n| `JavaProxiedException`          | Exception on the Java side, and call `$e-\u003egetJvmStackTrace()` for debug  |  \n| `RuntimeException`              | Normally never thrown, see exception message                             |\n\n\nAt filling time:\n\n| Exception                       | Description                                                              |                    \n|---------------------------------|--------------------------------------------------------------------------|\n| `BrokenJsonDataSourceException` | When the json datasource cannot be parsed                                |\n| `JavaProxiedException`          | Exception on the Java side, and call `$e-\u003egetJvmStackTrace()` for debug  |  \n\n\n\n## Installation\n\nThis project requires a java server (or service) running on the same machine\nthat will expose the jasper API to the php side (network bridge). \n\nCheck the installation example below or a more [complex doc here](https://docs.soluble.io/soluble-japha/install_server/).  \n\n### JasperBridge\n\nBuild a war file\n\n```shell\n# Example based on php-java-bridge master\n$ git clone https://github.com/belgattitude/php-java-bridge.git\n$ cd php-java-bridge\n$ ./gradlew war -I init-scripts/init.jasperreports.gradle -I init-scripts/init.mysql.gradle \n```\n\nDeploy on Tomcat (example on ubuntu `sudo apt install tomcat8`)\n\n```shell\n$ sudo cp ./build/libs/JavaBridgeTemplate.war /var/lib/tomcat8/webapps/JasperReports.war\n```\n\nWait few seconds and point your browser to [http://localhost:8080/JasperReports](http://localhost:8080/JasperReports), you\nshould see the php-java-bridge dashboard page.\n\n![](docs/assets/images/jasper_bridge_dashboard.png \"Jasper bridge dashboard\")\n\nThe bridge address can be used in the japha bridge adapter:\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Soluble\\Japha\\Bridge\\Adapter;\n\n$ba = new Adapter([\n    'driver' =\u003e 'Pjb62',\n    'servlet_address' =\u003e 'localhost:8080/JasperReports/servlet.phpjavabridge'    \n]);\n\n// This should print your JVM version\necho $ba-\u003ejavaClass('java.lang.System')-\u003egetProperty('java.version');\n\n```\n\nIf you encounter permissions problems (i.e. the pdf are created under tomcat8 user), just add your user \nto the tomcat group:\n\n```shell\n$ sudo usermod -a -G \u003ctomcat group name\u003e \u003cusername\u003e\n``` \n\n## Benchmarks\n\nEarly benchmarks for common operation (run on a laptop for now, will do soon on digitalocean). See `tests/bench/simple_benchmarks.php`.\n\n### Jasper compile time and filling (internal)\n\n| Benchmark name |  x1 | x5 | x10 | Average | Memory |\n|----| ----:|----:|----:|-------:|----:| \n| 00_report_mini.jrxml (compile) | 43.03ms| 179.05ms| 347.55ms| 35.60ms| 18.97Kb|\n| 00_report_mini.jrxml (fill) | 3.19ms| 9.15ms| 18.58ms| 1.93ms| 14.27Kb|\n| 01_report_default.jrxml (compile) | 39.24ms| 192.41ms| 338.65ms| 35.64ms| 0.31Kb|\n| 01_report_default.jrxml (fill) | 3.70ms| 11.22ms| 22.75ms| 2.35ms| 0.44Kb|\n\n\n### PDF exports\n\n| Benchmark name |  x1 | x5 | x10 | Average | Memory |\n|----| ----:|----:|----:|-------:|----:| \n| 00_report_mini.jrxml (text-only) | 38.74ms| 3.76ms| 8.58ms| 3.19ms| 0.79Kb|\n| 01_report_default.jrxml (text+png) | 318.68ms| 1,365.02ms| 2,709.56ms| 274.58ms| 0.75Kb|\n| 06_report_barcodes.jrxml (barcodes) | 123.81ms| 323.71ms| 630.51ms| 67.38ms| 0.75Kb|\n\n- Connection time: 3 ms\n\n  \n## Coding standards and interop\n\n* [PSR 7 HTTP Message](https://github.com/php-fig/http-message)\n* [PSR 4 Autoloader](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md)\n* [PSR 3 Logger interface](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)\n* [PSR 2 Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelgattitude%2Fsoluble-jasper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbelgattitude%2Fsoluble-jasper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelgattitude%2Fsoluble-jasper/lists"}