JasperReport导出PDF时如何直接生成Base64字符串而非物理文件?
JasperReport直接导出PDF为Base64字符串实现方案
完全可以实现,核心思路是将PDF输出目标从物理文件改为内存字节流,直接读取流中的二进制数据编码为Base64即可,无需生成落地文件。
适配你现有老版本API的实现代码
import java.io.ByteArrayOutputStream; import java.util.Base64; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JRExporter; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.JRExporterParameter; // 原有填充逻辑不变 JasperPrint print = JasperFillManager.fillReport(reportsrc, Param, conn); JRExporter exporter = new JRPdfExporter(); // 替换文件输出为内存字节流输出 ByteArrayOutputStream baos = new ByteArrayOutputStream(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); exporter.exportReport(); // 字节数组转Base64字符串 String pdfBase64Str = Base64.getEncoder().encodeToString(baos.toByteArray()); baos.close();
注意事项
- 如果是JDK8以下版本,没有内置
java.util.Base64,可以使用Apache Commons Codec库的org.apache.commons.codec.binary.Base64.encodeBase64String()方法完成编码。 - JasperReport 5.6及以上版本官方已废弃
setParameter写法,新版本推荐使用如下写法:
import net.sf.jasperreports.export.SimpleExporterInput; import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; // 填充逻辑不变 JasperPrint print = JasperFillManager.fillReport(reportsrc, Param, conn); JRPdfExporter exporter = new JRPdfExporter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); exporter.setExporterInput(new SimpleExporterInput(print)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(baos)); // 如有PDF特殊配置需求可额外设置PdfExporterConfiguration exporter.exportReport(); String pdfBase64Str = Base64.getEncoder().encodeToString(baos.toByteArray());
内容的提问来源于stack exchange,提问作者Teddybugs
相关产品推荐
相关产品推荐

