simitgroup/phpjasperxml

开源 Jasper Report Studio 的 PHP PDF 渲染器。

2.1.12 2024-07-19 12:42 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 规则

  1. 只有详细信息带会增长
  2. 位置类型(默认 "相对于顶部固定")
  3. 拉伸类型(默认 "不拉伸")

文本字段和静态文本

文本字段和静态文本是报告中最重要的元素。以下是兼容性细节。

矩形

椭圆

输出

PHPJasperxml 将将报告输出为几种格式。

表达式

jrxml 使用大量定义为 Java(Groovy)语法的表达式。它不完美地适合 PHP 环境。有时报告在 Jasperstudio 中看起来很漂亮,但在 PHP 中却不完全一样。了解 PHPJasperxml 如何评估表达式和流程很重要。以下是流程:

  1. phpjasperxml 从特定元素中提取表达式字符串
  2. 使用 preg_match 分析表达式,并将所需值替换为 $F{}、$V{}、$P{}。
  3. 如果值数据类型是文本/字符串类型(例如 java.lang.String),它将应用引号/转义字符串
  4. 如果有引号,它将替换 "+" 为 ".",因为 PHP 使用 "." 组合字符串
  5. 然后使用 eval() 进行评估,得到最终值。(由于 eval() 不安全,您不应允许不受信任的开发者定义表达式)。

表达式用于许多地方,包括显示值、设置超链接、设置图像位置、显示/隐藏特定元素或带。为了使报告呈现如预期,您应按照以下规则定义表达式:

  1. 使用更多 PHP 风格的语法:$F{字段名} == "COMPAREME",而不是 $F{字段名}.equal("COMPAREME")
  2. 如果您使用表达式执行某些操作/比较,请务必进行双重检查,比较 jasperstudio 和 phpjasperxml 生成的 pdf 的结果。
  3. 虽然有很多努力使表达式准确,但我仍然建议您在 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 中的脚本。

如何使用

  1. 创建脚本:"replace_as_alias"
  2. 在脚本中定义描述:str_replace("@",'alias',$F{email})
  3. textField 定义值来自脚本参数 "$P{replace_as_alias_SCRIPTLET}"

参考https://github.com/SIMITGROUP/phpjasperxml/blob/master/examples/groups.jrxml

❌ 样式

样式模板当前被忽略,不对元素产生影响。

支持的数据源

样本

  1. Postgresql
  2. Mysql
  3. PDO(其他数据库)
  4. Array(在库外准备关联数组)
  5. mongodb(实验性,使用 mongodb-ql)

Mongodb 使用

Mongodb 与其他 dbms 非常不同,因为 mongodb 使用层次文档结构。PHPJasperXML 实现与 jaspersoft mongodbql 相似的语法。有关 mongodbql 的信息,请参阅 这里

它只支持两种查询方法,findaggregate

  1. Find(findQuery)
  • findQuery:{详细信息}
  • findFields:{详细信息}
  • sort:{详细信息}
  • limit:int 详细信息
  1. Aggregate(aggregate)
  • 不支持的功能:mapReduce rowsToProcess batchSize maxTime collation