介绍下pdf打印工具类 JasperPrint
JasperPrint 工具类深度解析

JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类,其本质是 填充数据后的可打印报表对象,承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析:
一、核心定位与生命周期
- 中间态实体角色
JasperPrint 处于报表生成流程的中间阶段(生命周期模型):
JRXML(设计模板) → Jasper(编译模板) → JasperPrint(填充数据) → PDF/Excel(导出)
其内存结构中包含:
- 编译后的模板元数据
- 动态注入的参数集合(
Map<String, Object>) - 数据源绑定结果(
JRDataSource)
- 跨格式输出枢纽
支持通过JasperExportManager或JRPdfExporter导出为 PDF,也可适配 Excel/HTML 等其他格式,实现 一份填充数据多端复用 的特性。
二、核心功能实现
(一)数据填充
- 参数注入方式
Map<String,Object> params = new HashMap<>();params.put("title", "2025年度报表");JasperPrint print = JasperFillManager.fillReport(jasperFile, params, dataSource);
运行
- 支持基础类型、POJO、图片资源(需转
InputStream) - 参数作用域覆盖整个报表生命周期
-
数据源绑定
数据源类型 适用场景 代码示例 来源证据 JRBeanCollectionDataSourceList 集合数据绑定 new JRBeanCollectionDataSource(list)JREmptyDataSource无数据空报表生成 new JREmptyDataSource()ResultSet直接数据库查询结果 new JRResultSetDataSource(rs)
(二)打印控制
- 页面布局配置
PDFPrintable pdfPrintable = new PDFPrintable(print, Scaling.ACTUAL_SIZE);PageFormat pageFormat = new PageFormat();pageFormat.setOrientation(PageFormat.LANDSCAPE); // 横向打印
运行
- 支持缩放比例(
Scaling.SHRINK_TO_FIT等)、纸张大小(pageFormat.setPaper())
- 批量打印管理
通过List<JasperPrint>实现多文档串联打印,支持:- 页码连续编排
- 书签目录生成(
IS_CREATING_BATCH_MODE_BOOKMARKS参数)
三、PDF 导出实现
(一)基础导出模式
- 快速导出法
JasperExportManager.exportReportToPdfStream(print, outputStream);
运行
- 优点:代码简洁,自动处理字体嵌入
- 缺点:无法定制加密等高级功能
- 精细化控制法
JRPdfExporter exporter = new JRPdfExporter();exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, os);exporter.exportReport();
运行
- 支持 PDF 加密(
USER_PASSWORD/OWNER_PASSWORD) - 可配置权限(打印/复制/修改等)
(二)中文处理方案
- 字体配置关键点
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactorynet.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml
- 必须包含中文字体文件(如
stsong.ttf) - PDF 编码需设置为
UniGB-UCS2-H
- 常见问题解决
- 乱码:检查字体是否嵌入(
PDF Embedded=true) - 空白页:调整
detail区域高度避免溢出
- 乱码:检查字体是否嵌入(
四、企业级应用实践
(一)SpringBoot 整合
- 工具类封装
public class JasperPdfUtil {public static byte[] export(Map<String,Object> params) throws JRException {JasperReport report = JasperCompileManager.compileReport("template.jrxml");JasperPrint print = JasperFillManager.fillReport(report, params, new JREmptyDataSource());return JasperExportManager.exportReportToPdf(print);}}
运行
- 支持模板热加载
- 结合
ResponseEntity实现 RESTful 输出
- 动态模板方案
Resource resource = new ClassPathResource("templates/"+templateName+".jasper");JasperPrint print = JasperFillManager.fillReport(resource.getInputStream(), params, dataSource);
运行
- 模板路径可配置化
- 支持云端存储模板(如 OSS)
(二)性能优化
-
内存控制策略
- 启用虚拟化模式(
IS_IGNORE_PAGINATION分页优化) - 使用
JRFileVirtualizer处理大报表
- 启用虚拟化模式(
-
异步导出方案
CompletableFuture.supplyAsync(() -> {return JasperExportManager.exportReportToPdf(print);}).thenAccept(pdfBytes -> {// 写入消息队列或OSS});
运行
- 避免 HTTP 请求超时
五、特殊场景处理
- Base64 编码输出
byte[] pdfBytes = JasperExportManager.exportReportToPdf(print);String base64Str = new BASE64Encoder().encode(pdfBytes);
运行
- 前端渲染需添加
data:application/pdf;base64,前缀 - 需替换
+为%2B防止传输错误
- 加密文档生成
exporter.setParameter(PdfExporterConfiguration.IS_ENCRYPTED, true);exporter.setParameter(PdfExporterConfiguration.USER_PASSWORD, "user123");exporter.setParameter(PdfExporterConfiguration.OWNER_PASSWORD, "admin456");
运行
- 支持 128 位密钥加密
六、调试与监控
- 日志追踪配置
<logger name="net.sf.jasperreports" level="DEBUG"/>
- 可捕获模板编译错误、数据绑定异常
- 可视化预览器
JasperViewer.viewReport(print, false); // 弹出预览窗口
运行
- 本地调试时快速验证布局
七、技术演进趋势
-
云原生支持
- 与 K8s 结合实现弹性扩缩容
- 模板存储从本地文件转向 MinIO/OSS
-
智能化增强
- 集成 AI 引擎自动优化报表布局
- 动态参数推荐(基于历史数据分析)

JasperPrint 工作流程图
(流程图示意:模板编译 → 数据填充 → 打印控制 → 格式导出)
总结
JasperPrint 作为 JasperReports 生态中的 数据承载中枢,其核心价值在于解耦了模板设计与数据呈现。通过精准的参数控制、灵活的数据源适配以及深度的格式定制能力,使其成为企业级报表系统的首选方案。在云原生与 AI 技术驱动下,未来将向 动态化、服务化、智能化 方向持续演进。
分享
追问
相关组织
| 组织名称 | 概述 |
|---|---|
| JasperSoft | 软件/技术一家提供报表工具JasperReport的公司,用于实现PDF打印。 |
| TIBCO | 软件/技术提供Jaspersoft Studio软件,用于绘制报表模板。 |
相关人物
| 人物名称 | 概述 |
|---|---|
| junqiang.lu | 开发者/程序员开发了JasperPdfUtil工具类的作者。 |
JasperPrint 支持哪些数据源?
JasperPrint 支持的数据源类型全解析
作为 JasperReports 框架的核心数据载体,JasperPrint 支持的数据源类型与其底层接口 JRDataSource 的实现密切相关。根据资料中的技术文档和代码实践,其数据源支持体系可划分为以下六类:
一、JDBC 数据库连接(关系型数据源)
实现方式
通过 java.sql.Connection 对象直接传递 SQL 查询结果,适用于传统关系型数据库(如 MySQL、Oracle)。
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, conn); // 自动执行模板中的 SQL
运行
核心特征:
- 内置支持 JDBC 驱动(需在报表模板中预定义 SQL 查询)
- 支持动态参数化 SQL(通过
$P{param}注入)
二、集合类数据源(JavaBean/List/Map)
实现方式
- JavaBean 集合:通过
JRBeanCollectionDataSource转换 List<POJO>
List<Customer> customers = customerDao.getAll();
JRDataSource ds = new JRBeanCollectionDataSource(customers);
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds); // 自动映射字段名
运行
- Map 集合:直接传递
Map<String, Object>,适用于无结构化数据的场景
Map<String, Object> data = new HashMap<>();
data.put("sales", 50000);
JasperPrint print = JasperFillManager.fillReport(jasperReport, data, new JREmptyDataSource());
运行
核心特征:
- 字段名需与模板中的
$F{field}严格匹配 - 支持嵌套对象(如
$F{user.address.city})
三、空数据源(无数据填充)
实现方式
使用 JREmptyDataSource 生成无数据报表,常用于静态参数展示。
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
运行
应用场景:
- 生成仅含标题、页脚的空白模板
- 参数化动态内容(如图片路径、标题文本)
四、JSON 数据源(非结构化数据)
实现方式
通过 JsonQueryExecuterFactory 解析 JSON 输入流,支持复杂嵌套结构。
InputStream jsonStream = new ByteArrayInputStream(jsonStr.getBytes());
params.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, jsonStream);
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
运行
关键配置:
- 需在模板中定义 JSON 路径表达式(如
$.users[0].name) - 支持本地化参数(
JSON_LOCALE)和日期格式化
五、文件类数据源(Excel/CSV/XML)
实现方式
通过自定义 JRDataSource 实现类解析文件,如:
- Excel 数据源:使用
JRXlsxDataSource
JRXlsxDataSource ds = new JRXlsxDataSource(new File("data.xlsx"));
ds.setSheetSelection(0); // 选择工作表
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds);
运行
- CSV 数据源:使用
JRCsvDataSource
JRCsvDataSource ds = new JRCsvDataSource(new File("data.csv"));
ds.setColumnNames(new String[]{"id", "name"}); // 定义列名
运行
核心特征:
- 需引入
jasperreports-components依赖 - 支持分页读取大文件
六、自定义数据源(扩展接口)
实现方式
继承 JRDataSource 接口,处理特殊数据格式(如 NoSQL、API 接口)。
public class CustomDataSource implements JRDataSource {private Iterator<Data> iterator;public boolean next() { return iterator.hasNext(); }public Object getFieldValue(JRField field) {return iterator.next().get(field.getName());}
}
// 使用
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new CustomDataSource(data));
运行
典型应用:
- MongoDB 文档集合
- REST API 分页响应
数据源选择决策矩阵
| 数据类型 | 适用场景 | 性能表现 | 开发复杂度 | 引用来源 |
|---|---|---|---|---|
| JDBC | 结构化数据库报表 | ★★★★☆ | ★★☆☆☆ | |
| JavaBean集合 | POJO 业务对象导出 | ★★★★☆ | ★☆☆☆☆ | |
| JSON | 微服务接口数据聚合 | ★★★☆☆ | ★★★☆☆ | |
| 文件类 | 离线数据批量处理 | ★★☆☆☆ | ★★★★☆ | |
| 自定义 | 非标系统集成 | ★☆☆☆☆ | ★★★★★ |
高级数据源特性
- 混合数据源
支持主报表与子报表使用不同数据源(如主表用 JDBC,子表用 JSON):
<subreport><dataSourceExpression><![CDATA[new JsonDataSource($P{API_DATA})]]></dataSourceExpression></subreport>
- 动态数据切换
通过JRFillParameter在运行时切换数据源:
params.put(JRParameter.REPORT_DATA_SOURCE, ds1); // 初始数据源if (condition) params.replace(JRParameter.REPORT_DATA_SOURCE, ds2);
运行
- 虚拟化大数据集
使用JRFileVirtualizer分页加载海量数据,避免内存溢出:
JRVirtualizer virtualizer = new JRFileVirtualizer(100); // 每页100条params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
运行
常见问题解决方案
-
空指针异常
- 确保数据源不为
null,即使使用空数据源也需显式创建JREmptyDataSource - 检查模板字段名与数据源属性大小写是否一致
- 确保数据源不为
-
性能优化
- 启用分页模式:
params.put(JRParameter.IS_IGNORE_PAGINATION, false) - 对 JDBC 数据源添加 SQL 分页查询
- 启用分页模式:
-
编码问题
- JSON/CSV 数据源需统一使用 UTF-8 编码
- 中文字体需在
jasperreports.properties中注册
演进趋势
- 云原生数据源
支持从 AWS S3、阿里云 OSS 直接读取文件
OSSDataSource ds = new OSSDataSource("oss://bucket/report-data.csv");
运行
- 流式处理
通过 Reactive Streams 实现实时数据推送
Flux<Data> flux = service.getStreamingData();JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new FluxDataSource(flux));
运行
- AI 增强
自动推断数据源结构并生成适配模板
AIDataSourceAnalyzer.analyze(ds).generateTemplate();
运行
通过灵活选择数据源类型并优化实现,JasperPrint 可覆盖从传统数据库到现代数据湖的全场景报表需求,其扩展性设计(如自定义 JRDataSource)为复杂企业级应用提供了坚实基础
相关文章:
介绍下pdf打印工具类 JasperPrint
JasperPrint 工具类深度解析 JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类,其本质是 填充数据后的可打印报表对象,承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析: 一、核心定位与生命周…...
idea中或pycharm中编写Markdown文件
参考 ltjt_aiseek: seek_backend_py 项目 数智科技ai探索API接口开发 1. 安装 Django 框架 在开始创建 Django 项目之前,需要先安装 Django 框架。可以通过 PyCharm 的终端或者系统的命令行工具来完成安装。 使用 PyCharm 终端安装 打开 PyCharm,如果…...
Go红队开发—并发编程
文章目录 并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道 等协程sync.WaitGroup同步Runtime包Gosched()Goexit() 区别 同步变量sync.Mutex互斥锁atomic原子变量 SelectTicker定时器控制并发数量核心机制 并发编程阶段练习重要的细节端口扫描股票监控 并发编程…...
使用自动化运维工具 Ansible 集中化管理服务器
一、概述 Ansible 是一款为类 Unix 系统开发的自由开源的配置和自动化工具 官方网站:https://www.ansible.com/ Ansible 成立于 2013 年,总部设在北卡罗来纳州达勒姆,联合创始人 ad Ziouani 和高级副总裁 Todd Barr都是红帽的老员工。Ansible 旗下的开源软件 Ansible 十分…...
数据集笔记:新加坡 一些交通的时间序列统计量
1 机动车年度保有量 data.gov.sg 各类机动车年度保有量 数据范围:2005年1月 - 2020年12月 1.1 数据说明 非高峰时段车辆 包括周末车(Weekend Cars)和 修订版非高峰时段车辆(Revised Off Peak Cars),该…...
企业jsapi_ticket,java举例
在企业微信开发中,使用 Java 获取 jsapi_ticket 并生成签名的步骤如下。以下是完整的 Java 示例代码。 1. 获取 jsapi_ticket 的流程 获取 access_token。 使用 access_token 获取 jsapi_ticket。 使用 jsapi_ticket 生成签名(signature)。…...
【FL0090】基于SSM和微信小程序的球馆预约系统
🧑💻博主介绍🧑💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...
智能图像处理平台:图像处理配置类
这里我们先修改一下依赖,不用JavaCV,用openCV。 导入依赖: <!-- JavaCV 依赖,用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...
《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》
在人工智能的前沿领域,生成对抗网络(GAN)以其独特的对抗学习机制,为数据生成和处理带来了革命性的变革。生成器与判别器作为GAN的核心组件,它们之间的协作效率直接决定了GAN在图像生成、数据增强、风格迁移等众多应用中…...
【多模态大模型论文精读】MinMo语音交互大模型
写在前面:你需要一个更丝滑的语音助手 想象一下,你与一个语音助手对话,不再需要“嘿,Siri”或“小爱同学”这样的唤醒词,也不需要等待它一字一句地蹦出回复。你们可以像朋友一样,随时打断、插话,甚至同时说话。语音助手不仅能听懂你说了什么,还能理解你的语气、情感,…...
22-接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 方法一:双指针法 思路 使用两个指针 left 和 right 分别指向数组的两端,同时记录左边的最大高度 leftMax 和右边的最大高度 rig…...
如何长期保存数据(不包括云存储)最安全有效?
互联网各领域资料分享专区(不定期更新): Sheet 前言 这个问题需要考虑多个方面,比如存储介质的寿命、数据完整性、访问的便捷性,还有成本等因素。长期保存的话,存储介质的耐久性很重要。比如常见的硬盘、SSD、光盘、磁带等,各有优缺点。机械硬盘(HDD)的寿命一般在3-5年,…...
k8s拉取harbor镜像部署
在k8s中创建凭证 首先在节点docker登录harbor, 登录成功之后会在$HOME/.docker/ 生成一个config.json文件,这个就是登录凭证,后面docker pull就不需要再登录了。但是如果在k8s发布pod或者deploment时,这个凭证要在k8s中创建一个对…...
一周一个Unity小游戏2D反弹球游戏 - 球板的发球
前言 本文将实现当游戏开始时球在球板上,且不具备物理性,在Windows平台上通过点击屏幕来球发射,安卓平台上当手指触摸到屏幕上时进行发球,并此时开始具备物理性。 发球逻辑 首先在球板上创建一个球的发射点,新建一个空的游戏物体,并命名为BallPoint,并将其作为SpringBoa…...
C 语言共用体:深入理解与实践】
目录 一、引言 二、共用体的定义和基本语法 三、共用体的使用 3.1 声明共用体变量 3.2 给共用体成员赋值 3.3 共用体的内存布局 四、共用体的应用场景 4.1 节省内存空间 4.2 处理不同类型的数据 五、共用体使用的注意事项 六、总结 一、引言 在 C 语言中,共…...
Oracle性能调优(一):时间模型统计
Oracle性能调优(一):时间模型统计 时间模型统计视图时间模型统计指标时间模型统计视图 📖 DB Time的含义: DB Time表示前台会话在数据库调用中所花费的总时间,它是衡量数据库实例总负载的一个重要指标。DB Time是从实例启动时开始累计测量的,其计算方法是将所有前台会话…...
012 rocketmq事务消息
文章目录 事务消息概念介绍交互流程事务消息原理TransactionListener接⼝TransactionProducer.javaTransactionConsumer.java 事务消息 内置topic中的消息对消费者不可见 本地事务mq消息事务消息 消息队列 RocketMQ 版提供的分布式事务消息适⽤于所有对数据最终⼀致性有强需求…...
SpringBoot原理-02.自动配置-概述
一.自动配置 所谓自动配置,就是Spring容器启动后,一些配置类、bean对象就自动存入了IOC容器当中,而不需要我们手动声明,直接从IOC容器中引入即可。省去了繁琐的配置操作。 我们可以首先将spring项目启动起来,里面有一…...
知识图谱+智能问诊预诊系统vue+django+neo4j架构、带问诊历史
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 🤍编号:D032 🤍智能问答:智能问答自诊、预诊功能,同时可以保存问答历史 &…...
DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
Java数据结构_一篇文章了解常用排序_8.1
本文所有排序举例均默认为升序排列。 目录 1. 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想: 2.1.2 直接插入排序 2.1.3 希尔排序(缩小增量排序) 2.2 选择排序 2.2.1 基本思想: 2.2.2 直接选择排…...
(南京观海微电子)——倍压设计与应用
在电路设计过程中,当后级需要的电压比前级高出数倍而所需要的电流并不是很大时,就可以使用倍压整流电路。倍压整流:可以将较低的交流电压,用耐压较高的整流二极管和电容器,“整”出一个较高的直流电压。 01 倍压整流电…...
AtCoder Beginner Contest AT_abc395_d ABC395D Pigeon Swap 题解
前言 在谎言中迷茫,试图躲避瓶颈。 可惜细节太多,浪费五发罚时。 一个绿名用户,被出题人卡住。 八十六分钟多,才看见一抹绿。 本题解 LaTeX \LaTeX LATEX 格式可能不太美观,以内容为主。 题目大意 有一群鸽子和它…...
网络安全-使用DeepSeek来获取sqlmap的攻击payload
文章目录 概述DeepSeek使用创建示例数据库创建API测试sqlmap部分日志参考 概述 今天来使用DeepSeek做安全测试,看看在有思路的情况下实现的快不快。 DeepSeek使用 我有一个思路,想要测试sqlmap工具如何dump数据库的: 连接mysql数据库&#…...
【含文档+PPT+源码】基于SpringBoot+Vue医药知识学习与分享平台的设计与实现
项目介绍 本课程演示的是一款 基于SpringBootVue医药知识学习与分享平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署…...
coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以
coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以。 很简单。 准备工作,先发布你的工作流,和发布应用。 然后,点击扣子API 。 申请一个࿰…...
iOS for...in 循环
0x00 循环遍历一 输出结果是什么? NSMutableArray *marr [1, 2, 3].mutableCopy; for (NSNumber *number in marr) {NSLog("%", number);marr [4, 5, 6].mutableCopy; } NSLog("%", marr);0x01 循环遍历二 输出结果是什么? NS…...
《操作系统 - 清华大学》 9 -1:进程调度:背景
进程调度:基础概念与调度策略详解 在进程调度这部分,我们会涉及以下内容:背景介绍、各种各样的调度算法(包括通用操作系统的调度算法以及针对实时系统的算法),还会额外介绍一种调度算法。 一、CPU调度的背…...
NumPy的介绍
第四章:NumPy 基础 一 NumPy是什么 NumPy 数字集装箱 超级计算器。 NumPy 就像一台超级计算器,但它的计算对象不是简单的数字,而是成百上千个数字组成的「数字表格」。 假设你要统计全班 50 个同学的身高、体重、成绩,手动计算…...
【Python】基础语法三
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解Python的函数、列表和数组。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自ÿ…...
