azhai2023 / phpjasperxml
开源 Jasper Report Studio 的 PHP PDF 渲染器。
Requires
- php: >=7.4
- fakerphp/faker: ^1.17
- phpoffice/phpspreadsheet: ^1.20
- tecnickcom/tc-lib-pdf: *
- tecnickcom/tcpdf: ^6.4
This package is auto-updated.
Last update: 2024-10-01 00:09:19 UTC
README
这是一个 PHP 库,用于读取 Jasper 报告设计文件 (.jrxml) 并生成 PDF 文件。
该项目的目标是允许 PHP 开发者利用 WYSIWYG 概念轻松设计合理的优质可打印 PDF。然而,由于 .jrxml 文件是为 Java 项目设计的,phpjasperxml 无法在 PHP 环境中实现 100% 兼容。请参考兼容性描述了解您可以做什么以及不能做什么。
自 1.x 版本以来完全重写,如果您之前使用过 1.x 版本,请仔细验证您的输出,因为它与 Jasper Studio 的兼容性更好,但在最新版本中可能无法完美运行。
安装
最新的 phpjasperxml 需要 PHP 7.4,以及如 php-curl、php-intl、php-simplexml 等PHP扩展。
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
兼容性
通常,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{fieldname} == "COMPAREME",而不是 $F{fieldname}.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(字符串连接)
变量
变量很重要,但非常依赖于语言。以下是不支持的功能:
- 增量类型
计算函数
重置类型
排序字段
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(在库外部准备关联数组)