Использование 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 для API-интерфейса jasper, но я не прочту его, если смогу помочь.

2 ответа

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

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

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

Это позволит варьировать каталог подотчета в разных средах.

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

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

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

JasperDesign jd = JRXmlLoader.load(reportPath);
Другие вопросы по тегам