多个 Jasper 报告 - 单个请求
Multiple Jasper reports - Single request
我有一个要求,我可以在其中 select 多条记录,并为每个 selected 条目选择生成带有文档的压缩报告的操作(在我的例子中是 pdf)。
例如 Employee1、Employee2、Employee3 将被 selected,当我选择生成报告时,应该为员工生成 3 个报告,每个报告必须被压缩和下载。
现在我所做的是生成 jasperPrint 并将报告导出到 ZipOutputstream,并为每个员工创建一个新的 zipentry。
这意味着 运行 三次查询并将输出流添加到 zip。
有更好的方法吗?
您的解决方案通常是正确的方法,如果您需要避免多次查询,则可以使用其他方法。
将所有数据加载到 List<Employee>
中,并为每位员工传递 new JRBeanCollectionDataSource(List<Employee>)
。 (这会减少查询但会增加内存使用量)。
如果您可以控制页面(例如每页 1 名员工),您可以生成 1 个包含所有员工的 pdf,然后使用 itext 将其拆分为多个 pdf。
PdfReader reader = new PdfReader("nameOfReport.pdf");
int n = reader.getNumberOfPages();
int i = 0;
while ( i < n ) {
Document document = new Document(reader.getPageSizeWithRotation(1));
PdfCopy writer = new PdfCopy(document, new FileOutputStream("Employee_" + i + ".pdf"));
document.open();
PdfImportedPage page = writer.getImportedPage(reader, ++i);
writer.addPage(page);
document.close();
writer.close();
}
我有一个要求,我可以在其中 select 多条记录,并为每个 selected 条目选择生成带有文档的压缩报告的操作(在我的例子中是 pdf)。 例如 Employee1、Employee2、Employee3 将被 selected,当我选择生成报告时,应该为员工生成 3 个报告,每个报告必须被压缩和下载。
现在我所做的是生成 jasperPrint 并将报告导出到 ZipOutputstream,并为每个员工创建一个新的 zipentry。 这意味着 运行 三次查询并将输出流添加到 zip。
有更好的方法吗?
您的解决方案通常是正确的方法,如果您需要避免多次查询,则可以使用其他方法。
将所有数据加载到
List<Employee>
中,并为每位员工传递new JRBeanCollectionDataSource(List<Employee>)
。 (这会减少查询但会增加内存使用量)。如果您可以控制页面(例如每页 1 名员工),您可以生成 1 个包含所有员工的 pdf,然后使用 itext 将其拆分为多个 pdf。
PdfReader reader = new PdfReader("nameOfReport.pdf"); int n = reader.getNumberOfPages(); int i = 0; while ( i < n ) { Document document = new Document(reader.getPageSizeWithRotation(1)); PdfCopy writer = new PdfCopy(document, new FileOutputStream("Employee_" + i + ".pdf")); document.open(); PdfImportedPage page = writer.getImportedPage(reader, ++i); writer.addPage(page); document.close(); writer.close(); }