使用JasperReports和相对path

我有一个networking应用程序,客户已经请求看到一些报告。 方法是使用iReport并在屏幕上向他们显示报告。

我已经问过这样的事情了 。 但是今天我发现报告文件(jrxml)的path是绝对的。 所以我必须改变程序,所以它接受相对path。 我一直在尝试这样做,但似乎jrxml或编译(.jasper)文件都不接受相对path既不编译也不填充报告。

这是我得到这个目标:

//path is generated as request.getContextPath() + "/jrxmlFiles/" public void generateReport(HttpServletResponse res, ConexionAdmin con, String path) throws Exception{ ServletOutputStream out = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); JasperDesign jasperDesign = JRXmlLoader.load(path); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, pars, con.initConexion()); res.setContentType("application/pdf"); res.setContentLength(bytes.length); out = res.getOutputStream(); out.write(bytes, 0, bytes.length); res.setHeader("Cache-Control", "cache"); res.setHeader("Content-Disposition", "attachment; filename=report.pdf"); res.setHeader("Pragma", "cache"); res.setContentLength(bos.size()); out.write(bos.toByteArray()); out.flush(); bos.close(); out.close(); res.flushBuffer(); } 

这似乎与绝对path工作,但抛出我:

 Exception Message net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException 

当改为相对path时。 我已经search了networking,没有成功,如何改变我的适应。

我有jasper API的javaDoc,但我宁愿不读它通过,如果我可以帮助它。

  • path必须是绝对的。
  • 如果正在修改.jasper只能将.jasper文件编译为.jasper文件。 通常你可以加载.jasper文件并完全跳过编译。 它快得多。
  • .jasper.jrxml文件存储在Web根目录之外。
  • 在您的所有报告中创build以下参数:
        ROOT_DIR =“/ full / path / to / reports /”
        IMAGE_DIR = $ P {ROOT_DIR} +“images /”
        STYLES_DIR = $ P {ROOT_DIR} +“styles /”
        SUBREPORT_DIR = $ P {ROOT_DIR} +“子报表/”
        COMMON_DIR = $ P {ROOT_DIR} +“common /” 
  • 相对于$P{ROOT_DIR}参考项目(例如, $P{IMAGE_DIR}被定义为$P{ROOT_DIR} )。
  • 从您的环境中传递$P{ROOT_DIR}的值。
  • 将您的应用程序松散地耦合到您使用的任何报告框架。

我有同样的问题,我得到的解决scheme。 首先,将报告中使用的每个对象(子报表,图像等)和所有扩展名(.jasper,.jrxml)放在一个文件夹中,并将该文件夹放在C://磁盘中。 这可能是现在放在我的文档,或任何文字之间有空格的path,然后iReport看到它像“我的%20Documents”,它混淆了他。

因此,将文件夹放在C://中,将与报告相关的所有内容放在同一个文件夹中,并将相对path放在所有内容中。 这应该工作。 希望我帮助任何人。