2011-12-19 19 views
21

Sto scrivendo un semplice progetto di esempio per familiarizzare con Jasper Reports. Mi piacerebbe esportare un report Ho configurato in un PDF OutputStream, ma non c'è metodo factory per esso:Esportare JasperReport in PDF OutputStream?

InputStream template = JasperReportsApplication.class 
    .getResourceAsStream("/sampleReport.xml"); 
JasperReport report = JasperCompileManager.compileReport(template); 
JasperFillManager.fillReport(report, new HashMap<String, String>()); 
// nope, just chuck testa. 
//JasperExportManager.exportReportToPdfStream(report, new FileOutputStream(new File("/tmp/out.pdf"))); 

Come posso ottenere il PDF in un OutputStream?

risposta

28

Ok, ecco come funziona; JasperFillManager in realtà restituisce un oggetto JasperPrint, quindi:

// get the JRXML template as a stream 
InputStream template = JasperReportsApplication.class 
    .getResourceAsStream("/sampleReport.xml"); 
// compile the report from the stream 
JasperReport report = JasperCompileManager.compileReport(template); 
// fill out the report into a print object, ready for export. 
JasperPrint print = JasperFillManager.fillReport(report, new HashMap<String, String>()); 
// export it! 
File pdf = File.createTempFile("output.", ".pdf"); 
JasperExportManager.exportReportToPdfStream(print, new FileOutputStream(pdf)); 

godere.

+2

se si sta semplicemente cercando di report di output in un file, è possibile utilizzare ' exportReportToPdfFile' senza gestire outputstream da solo –

+0

Giusto, ma in questo modo mi dà la massima flessibilità; Posso scrivere il flusso di output in un file o attraverso la rete o ovunque io voglia :) –

+1

Nota che la compilazione è * di solito * un passaggio superfluo. Invece, il software dovrebbe compilare il rapporto usando il file '.jasper', piuttosto che ricompilare il file' .jrxml' ogni volta. –

16

È possibile utilizzare un JRExporter per esportare il report compilato in flussi e formati diversi.

JRExporter exporter = null; 

exporter = new JRPdfExporter(); 
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream); 
exporter.exportReport(); 

Si noti inoltre che ci sono altri esportatori:

exporter = new JRRtfExporter(); 
exporter = new JRHtmlExporter(); 

Puoi trovare più esportatori disponibile qui: http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRExporter.html

Tutti dovrebbero accettare un parametro OUTPUT_STREAM per controllare la destinazione del report .

+0

Migliore perché polimorfo –

+1

Dopo 5 anni, JRExportParameter è stato dichiarato obsoleto, ho aggiunto una risposta non esauriente [http://stackoverflow.com/a/35916470/5292302) –

6

JRExporterParameter è deprecato nelle ultime versioni, Questo è un non deprecato soluzione del @stevemac answer

JRPdfExporter exporter = new JRPdfExporter(); 
exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); 
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream)); 
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration(); 
configuration.setMetadataAuthor("Petter"); //why not set some config as we like 
exporter.setConfiguration(configuration); 
exporter.exportReport(); 
Problemi correlati