Spring Boot项目用Jasper Report导出PDF到指定本地路径的实现方案
你提供的控制器代码截图如下:
解决方案
以下按两种常见使用场景给出修改方案:
场景1:服务端部署在你本地,需将生成的PDF存储到你电脑的指定目录
该场景适合你本地跑项目,需要把生成的PDF持久化存储到本地固定文件夹的情况:
- 第一步:在
application.properties或application.yml中配置自定义导出路径,避免硬编码方便后续修改# 替换为你自己需要的存储路径,Windows示例:D:/报表导出/,Mac/Linux示例:/Users/xxx/report/export/ pdf.export.save-path=D:/Jasper报表导出/ - 第二步:修改控制器代码,替换原来的项目相对路径为你配置的指定路径
@RestController public class ReportExportController { // 注入配置的导出路径 @Value("${pdf.export.save-path}") private String pdfExportPath; @GetMapping("/exportPdfToLocal") public String exportPdf() throws JRException { // Jasper模板加载、参数填充、数据源设置逻辑和你原有代码一致 JasperReport jasperReport = (JasperReport) JRLoader.loadObject(new ClassPathResource("jasper/你的模板文件.jasper").getInputStream()); Map<String, Object> params = new HashMap<>(); // 自行补充你的业务参数 JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(你的业务数据集合); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource); // 校验导出目录是否存在,不存在自动创建 File exportDir = new File(pdfExportPath); if (!exportDir.exists()) { exportDir.mkdirs(); } // 拼接完整导出文件路径 String fullExportPath = pdfExportPath + "业务报表_" + System.currentTimeMillis() + ".pdf"; // 导出到指定路径 JasperExportManager.exportReportToPdfFile(jasperPrint, fullExportPath); return "导出成功,文件路径:" + fullExportPath; } } - 注意路径格式:Windows系统下路径分隔符可以用
/或者转义后的\\,不要直接使用未转义的\,否则会被识别为转义字符导致路径错误。
场景2:需要让前端用户将PDF下载到自己电脑的任意指定路径
该场景适合项目部署在服务器,用户通过浏览器访问接口下载PDF的情况,不需要在服务端存储文件,直接将流写入响应,浏览器会自动弹出下载框让用户选择本地存储路径:
@GetMapping("/downloadPdf") public void downloadPdf(HttpServletResponse response) throws JRException, IOException { // 模板加载、数据填充逻辑和原有逻辑一致 JasperReport jasperReport = (JasperReport) JRLoader.loadObject(new ClassPathResource("jasper/你的模板文件.jasper").getInputStream()); Map<String, Object> params = new HashMap<>(); JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(你的业务数据集合); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource); // 设置响应头 response.setContentType("application/pdf"); response.setCharacterEncoding("UTF-8"); // 编码文件名避免中文乱码 String downloadFileName = URLEncoder.encode("自定义报表名称.pdf", "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName); // 直接输出PDF到响应流 ServletOutputStream outputStream = response.getOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream); outputStream.flush(); outputStream.close(); }
异常排查
- 若出现权限报错,检查你指定的导出目录是否给了程序运行用户的读写权限
- 若提示路径不存在,确认你已经添加了目录自动创建的逻辑,不要依赖手动创建目录
内容的提问来源于stack exchange,提问作者Med Amir Jemâa
相关产品推荐
相关产品推荐

