JasperReports mit einem relativen Pfad verwenden

Ich habe eine Web-App und der Kunde hat gebeten, einige Berichte zu sehen. Der Ansatz bestand darin, iReport zu verwenden und ihnen den Bericht auf dem Bildschirm zu zeigen.

Ich habe schon so etwas gefragt . Aber heute habe ich festgestellt, dass die Pfade zu den Berichtsdateien (jrxml) absolut sind. Also muss ich das Programm so ändern, dass es relative Pfade akzeptiert. Ich habe versucht, dies zu tun, aber es scheint, dass weder die jrxml-Datei noch die kompilierten (.jasper) -Dateien relative Pfade akzeptieren, um den Bericht weder zu kompilieren noch zu füllen.

Das habe ich bis jetzt erreicht:

//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(); } 

Dies scheint mit absoluten Pfaden zu funktionieren, wirft mich aber auf:

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

wenn zu einem relativen Pfad geändert wird. Ich habe das Netz mit keinem Erfolg gesucht, wie man zu meinen Anfällen ändert.

Ich habe das JavaDoc für die Jaspis-API, aber ich lese es lieber nicht durch, wenn ich es helfen kann.

  • Pfade müssen absolut sein.
  • Kompilieren Sie .jrxml Dateien nur in .jasper Dateien, wenn die .jrxml geändert wird. Normalerweise können Sie nur die .jasper Datei laden und die Kompilierung überspringen. Es ist viel schneller.
  • Speichern Sie .jrxml und .jrxml Dateien außerhalb Ihres .jrxml .
  • Erstellen Sie die folgenden Parameter in allen Ihren Berichten:
        ROOT_DIR = "/ Voll / Pfad / zu / Berichte /"
        IMAGE_DIR = $ P {ROOT_DIR} + "Bilder /"
        STYLES_DIR = $ P {ROOT_DIR} + "Stile /"
        SUBREPORT_DIR = $ P {ROOT_DIR} + "Unterberichte /"
        COMMON_DIR = $ P {ROOT_DIR} + "common /" 
  • Referenzelemente relativ zu $P{ROOT_DIR} (z. B. $P{IMAGE_DIR} ist definiert als $P{ROOT_DIR} ).
  • $P{ROOT_DIR} den Wert von $P{ROOT_DIR} aus Ihrer Umgebung.
  • Verknüpfen Sie Ihre Anwendung locker mit einem von Ihnen verwendeten Berichts-Framework.

Dann benutze die Ausdrücke wenn nötig. Zum Beispiel Referenzunterberichte wie folgt:

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

Dadurch kann das Unterberichtverzeichnis zwischen den Umgebungen variieren.

Ich hatte das gleiche Problem, und ich habe die Lösung. Platzieren Sie zunächst alle Objekte (Unterberichte, Bilder usw.), die im Bericht und allen Erweiterungen (.jasper, .jrxml) verwendet werden, in einen Ordner und legen Sie diesen Ordner auf C: // disk ab. Wahrscheinlich befindet es sich jetzt irgendwo in Eigene Dateien oder in irgendeinem Pfad, der Leerzeichen zwischen Wörtern enthält, und dann sieht iReport es wie “My% 20Documents” und es verwirrt ihn.

Legen Sie also den Ordner in C: // ab, legen Sie den gesamten mit Ihrem Bericht verbundenen Inhalt in den gleichen Ordner und legen Sie die relativen Pfade zu allem fest. Das sollte funktionieren. Ich hoffe, ich habe jedem geholfen.