simitgroup / phpjasperxml
开源 Jasper Report Studio 的 PHP PDF 渲染器。
Requires
- php: >=7.4
- fakerphp/faker: ^1.17
- mongodb/mongodb: ^1.17
- ovidigital/js-object-to-json: ^1.1
- phpoffice/phpspreadsheet: ^1.20
- tecnickcom/tc-lib-pdf: *
- tecnickcom/tcpdf: ^6.4
This package is auto-updated.
Last update: 2024-09-04 14:37:01 UTC
README
这是一个 PHP 库,用于读取 Jasper 报告设计的文件 (.jrxml) 并生成 PDF 文件。
此项目的目标是允许 PHP 开发者使用 WYSIWYG 概念轻松设计合理的优质可打印 PDF 文件。然而,由于 .jrxml 文件是为 Java 项目设计的,phpjasperxml 无法在 PHP 环境中实现 100% 兼容。请参阅兼容性描述以了解您能做什么以及您不能做什么。
从版本 1.x 以来完全重写,如果您之前使用过 1.x 版本,请仔细检查您的输出,因为它对 Jasper Studio 更为兼容,但在最后一个版本中可能无法完美运行。
变更日志
从 2.1.0 版本开始跟踪变更日志 这里
安装
最新版本的 phpjasperxml 需要 PHP 7.4-8.2,以及 php-curl、php-intl、php-simplexml 等扩展。
composer require simitgroup/phpjasperxml
如何使用
<?php require __DIR__."/vendor/autoload.php"; use simitsdk\phpjasperxml\PHPJasperXML; $filename = __DIR__.'/sample.jrxml'; $data=[ ['user_id'=>0, 'fullname' => 'name1','email'=>'email1@a.com','gender'=>'M' ], ['user_id'=>1, 'fullname' => 'name2','email'=>'email2@a.com','gender'=>'F' ], ['user_id'=>2, 'fullname' => 'name3','email'=>'email3@a.com','gender'=>'M' ], ]; $config = ['driver'=>'array','data'=>$data]; $report = new PHPJasperXML(); $report->load_xml_file($filename) ->setDataSource($config) ->export('Pdf');
如果您想使用数据库驱动程序而不是准备数组,请参阅 https://github.com/SIMITGROUP/phpjasperxml/blob/master/examples/databasesample.php
示例
请参阅示例: https://github.com/SIMITGROUP/phpjasperxml/wiki/Sample-output
尝试示例
cd phpjasperxml php -S 0.0.0.0:9999 -t .
然后浏览到 https://:9999/examples
兼容性
通常,phpjasperxml 提供以下兼容性结果:
带
带支持两种打印顺序
- 垂直
- 水平
❗ 根据尝试和错误,某些带如页眉、列页脚、页脚不允许根据文本字段 "stretchHeight" 增长。为了使生活更简单,phpjasperxml 规则
- 只有详细信息带会增长
- 位置类型(默认 "相对于顶部固定")
- 拉伸类型(默认 "不拉伸")
文本字段和静态文本
文本字段和静态文本是报告中最重要的元素。以下是兼容性细节。
行
矩形
椭圆
输出
PHPJasperxml 将将报告输出为几种格式。
表达式
jrxml 使用大量定义为 Java(Groovy)语法的表达式。它不完美地适合 PHP 环境。有时报告在 Jasperstudio 中看起来很漂亮,但在 PHP 中却不完全一样。了解 PHPJasperxml 如何评估表达式和流程很重要。以下是流程:
- phpjasperxml 从特定元素中提取表达式字符串
- 使用 preg_match 分析表达式,并将所需值替换为 $F{}、$V{}、$P{}。
- 如果值数据类型是文本/字符串类型(例如 java.lang.String),它将应用引号/转义字符串
- 如果有引号,它将替换 "+" 为 ".",因为 PHP 使用 "." 组合字符串
- 然后使用 eval() 进行评估,得到最终值。(由于 eval() 不安全,您不应允许不受信任的开发者定义表达式)。
表达式用于许多地方,包括显示值、设置超链接、设置图像位置、显示/隐藏特定元素或带。为了使报告呈现如预期,您应按照以下规则定义表达式:
- 使用更多 PHP 风格的语法:$F{字段名} == "COMPAREME",而不是 $F{字段名}.equal("COMPAREME")
- 如果您使用表达式执行某些操作/比较,请务必进行双重检查,比较 jasperstudio 和 phpjasperxml 生成的 pdf 的结果。
- 虽然有很多努力使表达式准确,但我仍然建议您在 SQL、PHP 级别进行计算。例如:使用 SQL 计算更有保证:SELECT a+b+c as result1 from mytable(假设 a=1,b=2,c=3,则 result1=6)然后 $F{a}+$F{b}+$F{c} // result1 很可能 = 6,但也有可能变成 123(拼接 3 个字符串)
变量
变量很重要,但非常依赖于语言。以下是受支持的功能
- 增量类型
计算函数
重置类型
排序字段
SortField 支持字段 ASC 和 DESC。变量/函数不受支持
脚本
脚本是一种允许报告从现有函数中获取特定值的方法。为了尽可能与 jasperstudio 兼容,我们在脚本描述中定义 PHP 代码使用表达式方法,这样在 jasperstudio 中不会发出警报。然后在 phpjasperxml 中我们将执行并将值放入脚本参数。有关更多信息,请参阅 jasperreport 中的脚本。
如何使用
- 创建脚本:"replace_as_alias"
- 在脚本中定义描述:str_replace("@",'alias',$F{email})
- textField 定义值来自脚本参数 "$P{replace_as_alias_SCRIPTLET}"
参考https://github.com/SIMITGROUP/phpjasperxml/blob/master/examples/groups.jrxml
❌ 样式
样式模板当前被忽略,不对元素产生影响。
支持的数据源
- Postgresql
- Mysql
- PDO(其他数据库)
- Array(在库外准备关联数组)
- mongodb(实验性,使用 mongodb-ql)
Mongodb 使用
Mongodb 与其他 dbms 非常不同,因为 mongodb 使用层次文档结构。PHPJasperXML 实现与 jaspersoft mongodbql
相似的语法。有关 mongodbql
的信息,请参阅 这里
它只支持两种查询方法,find
和 aggregate
- Find(findQuery)
- findQuery:{详细信息}
- findFields:{详细信息}
- sort:{详细信息}
- limit:int 详细信息
- Aggregate(aggregate)
- 不支持的功能:mapReduce rowsToProcess batchSize maxTime collation