У меня есть веб-приложение, и клиент запросил несколько отчетов. Подход заключался в использовании iReport и отображении отчета на экране.
Я уже просил что-то вроде этого . Но сегодня я обнаружил, что пути к файлам отчетов (jrxml) абсолютны. Поэтому мне нужно изменить программу, чтобы она принимала относительные пути. Я пытался это сделать, но кажется, что ни jrxml, ни скомпилированные (.jasper) файлы не принимают относительные пути ни для компиляции, ни для заполнения отчета.
Вот что я так далеко зашел:
//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();
}
Кажется, это работает с абсолютными путями, но меня бросает:
Exception Message
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException
при изменении на относительный путь. Я искал в сети безуспешно, как переодеться.
У меня есть javaDoc для jasper API, но я бы предпочел не читать его, если могу.