Использование JasperReports с относительным путем

У меня есть веб-приложение, и клиент запросил несколько отчетов. Подход состоял в том, чтобы использовать 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, но я скорее не прочитал его, если смогу помочь.

Ответы

Ответ 1

  • Пути должны быть абсолютными.
  • Скомпилируйте .jrxml файлы в .jasper файлы, если изменяется .jrxml. Обычно вы можете просто загрузить файл .jasper и вообще пропустить компиляцию. Это намного быстрее.
  • Храните файлы .jasper и .jrxml вне вашего веб-корня.
  • Создайте следующие параметры во всех своих отчетах:
       ROOT_DIR = "/full/path/to/reports/"
       IMAGE_DIR = $P{ROOT_DIR} + "images/"
       STYLES_DIR = $P{ROOT_DIR} + "styles/"
       SUBREPORT_DIR = $P{ROOT_DIR} + "subreports/"
       COMMON_DIR = $P{ROOT_DIR} + "common/"
  • Элементы сравнения относительно $P{ROOT_DIR} (например, $P{IMAGE_DIR} определены в терминах $P{ROOT_DIR}).
  • Передайте значение $P{ROOT_DIR} из вашей среды.
  • Смело соедините свое приложение с любой используемой структурой отчетности.

Затем при необходимости используйте выражения. Например, ссылочные вложенные отчеты:

<subreportExpression>
  <![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]>
</subreportExpression>

Это позволит каталогу подчиненности меняться между средами.

Ответ 2

У меня была та же проблема, и я получил решение. Сначала поместите каждый объект (подзаголовок, изображение и т.д.), Используемый в отчете, и все расширения (.jasper,.jrxml) в одной папке и поместите эту папку в диск C://. Вероятно, теперь он находится где-то в My Documents или в любом пути, в котором есть пробелы между словами, а затем iReport видит его как "My %20Documents", и он смущает его.

Итак, поместите папку в C://, поместите все материалы, относящиеся к вашему отчету, в одну папку и поместите относительные пути ко всему. Это должно сработать. Надеюсь, я помог всем.

Ответ 3

Path path = Paths.get("", new String[0]);   
String reportPath=path.toAbsolutePath().toString()+//reports//letter.jrxml";

JasperDesign jd = JRXmlLoader.load(reportPath);