azhai2023/phpjasperxml

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

v1.0.1 2023-08-22 06:29 UTC

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 规则

  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{fieldname} == "COMPAREME",而不是 $F{fieldname}.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(字符串连接)

变量

变量很重要,但非常依赖于语言。以下是不支持的功能:

  • 增量类型

计算函数

重置类型

排序字段

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(在库外部准备关联数组)