JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类,其本质是 填充数据后的可打印报表对象,承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析:
JRXML(设计模板) → Jasper(编译模板) → JasperPrint(填充数据) → PDF/Excel(导出)
其内存结构中包含:
Map
)JRDataSource
)JasperExportManager
或 JRPdfExporter
导出为 PDF,也可适配 Excel/HTML 等其他格式,实现 一份填充数据多端复用 的特性。 Map params = new HashMap<>();
params.put("title", "2025年度报表");
JasperPrint print = JasperFillManager.fillReport(jasperFile, params, dataSource);
运行
InputStream
)数据源绑定
数据源类型 | 适用场景 | 代码示例 | 来源证据 |
---|---|---|---|
JRBeanCollectionDataSource |
List 集合数据绑定 | 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
实现多文档串联打印,支持:
IS_CREATING_BATCH_MODE_BOOKMARKS
参数) JasperExportManager.exportReportToPdfStream(print, outputStream);
运行
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, os);
exporter.exportReport();
运行
USER_PASSWORD
/OWNER_PASSWORD
) net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml
stsong.ttf
)UniGB-UCS2-H
PDF Embedded=true
)detail
区域高度避免溢出 public class JasperPdfUtil {
public static byte[] export(Map 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);
运行
内存控制策略
IS_IGNORE_PAGINATION
分页优化)JRFileVirtualizer
处理大报表异步导出方案
CompletableFuture.supplyAsync(() -> {
return JasperExportManager.exportReportToPdf(print);
}).thenAccept(pdfBytes -> {
// 写入消息队列或OSS
});
运行
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");
运行
JasperViewer.viewReport(print, false); // 弹出预览窗口
运行
云原生支持
智能化增强
JasperPrint 工作流程图
(流程图示意:模板编译 → 数据填充 → 打印控制 → 格式导出)
JasperPrint 作为 JasperReports 生态中的 数据承载中枢,其核心价值在于解耦了模板设计与数据呈现。通过精准的参数控制、灵活的数据源适配以及深度的格式定制能力,使其成为企业级报表系统的首选方案。在云原生与 AI 技术驱动下,未来将向 动态化、服务化、智能化 方向持续演进。
分享
追问
相关组织
组织名称 | 概述 |
---|---|
JasperSoft |
软件/技术一家提供报表工具JasperReport的公司,用于实现PDF打印。 |
TIBCO |
软件/技术提供Jaspersoft Studio软件,用于绘制报表模板。 |
相关人物
人物名称 | 概述 |
---|---|
junqiang.lu |
开发者/程序员开发了JasperPdfUtil工具类的作者。 |
JasperPrint 支持哪些数据源?
作为 JasperReports 框架的核心数据载体,JasperPrint 支持的数据源类型与其底层接口 JRDataSource
的实现密切相关。根据资料中的技术文档和代码实践,其数据源支持体系可划分为以下六类:
实现方式
通过 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
运行
核心特征:
$P{param}
注入)实现方式
JRBeanCollectionDataSource
转换 List<POJO>List customers = customerDao.getAll();
JRDataSource ds = new JRBeanCollectionDataSource(customers);
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds); // 自动映射字段名
运行
Map
,适用于无结构化数据的场景Map 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());
运行
应用场景:
实现方式
通过 JsonQueryExecuterFactory
解析 JSON 输入流,支持复杂嵌套结构。
InputStream jsonStream = new ByteArrayInputStream(jsonStr.getBytes());
params.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, jsonStream);
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
运行
关键配置:
$.users[0].name
)JSON_LOCALE
)和日期格式化实现方式
通过自定义 JRDataSource
实现类解析文件,如:
JRXlsxDataSource
JRXlsxDataSource ds = new JRXlsxDataSource(new File("data.xlsx"));
ds.setSheetSelection(0); // 选择工作表
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds);
运行
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 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));
运行
典型应用:
数据类型 | 适用场景 | 性能表现 | 开发复杂度 | 引用来源 |
---|---|---|---|---|
JDBC | 结构化数据库报表 | ★★★★☆ | ★★☆☆☆ | |
JavaBean集合 | POJO 业务对象导出 | ★★★★☆ | ★☆☆☆☆ | |
JSON | 微服务接口数据聚合 | ★★★☆☆ | ★★★☆☆ | |
文件类 | 离线数据批量处理 | ★★☆☆☆ | ★★★★☆ | |
自定义 | 非标系统集成 | ★☆☆☆☆ | ★★★★★ |
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)
编码问题
jasperreports.properties
中注册 OSSDataSource ds = new OSSDataSource("oss://bucket/report-data.csv");
运行
Flux flux = service.getStreamingData();
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new FluxDataSource(flux));
运行
AIDataSourceAnalyzer.analyze(ds).generateTemplate();
运行
通过灵活选择数据源类型并优化实现,JasperPrint 可覆盖从传统数据库到现代数据湖的全场景报表需求,其扩展性设计(如自定义 JRDataSource
)为复杂企业级应用提供了坚实基础