2011-12-19 39 views
21

Tôi đang viết một dự án mẫu khá đơn giản để tự làm quen với Báo cáo Jasper. Tôi muốn xuất báo cáo tôi đã cấu hình để một PDF OutputStream, nhưng không có phương pháp nhà máy cho nó:Xuất JasperReport sang 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"))); 

Làm thế nào tôi có thể nhận được PDF trong một OutputStream?

Trả lời

28

Ok, vì vậy, đây là cách hoạt động; JasperFillManager thực sự trả về đối tượng JasperPrint, vì vậy:

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

Thưởng thức.

+2

Nếu bạn chỉ đơn giản là cố gắng để báo cáo đầu ra vào một tập tin, bạn có thể sử dụng ' exportReportToPdfFile' mà không tự xử lý đầu ra của mình –

+0

Phải, nhưng cách này mang lại cho tôi sự linh hoạt nhất; Tôi có thể viết luồng đầu ra vào một tập tin hoặc trên mạng hoặc bất cứ nơi nào tôi muốn :) –

+1

Lưu ý rằng biên dịch là * thường * một bước không cần thiết. Thay vào đó, phần mềm nên điền vào báo cáo bằng cách sử dụng tệp '.jasper', thay vì phải biên dịch lại tệp' .jrxml' mỗi lần. –

16

Bạn có thể sử dụng JRExporter để xuất báo cáo đã điền vào các luồng và định dạng khác nhau.

JRExporter exporter = null; 

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

Cũng lưu ý rằng có những nhà xuất khẩu khác:

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

Bạn có thể tìm thấy các nhà xuất khẩu hơn có sẵn ở đây: http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRExporter.html

Tất cả họ đều phải chấp nhận một tham số OUTPUT_STREAM để kiểm soát các điểm đến của báo cáo .

+0

Tốt hơn vì đa hình –

+1

Sau 5 năm, JRExportParameter đã không còn được dùng nữa, tôi đã thêm một câu trả lời không được chấp nhận [http://stackoverflow.com/a/35916470/5292302) –

6

JRExporterParameter bị phản đối trong các phiên bản mới nhất, Đây là một không bị phản đối giải pháp của @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(); 
Các vấn đề liên quan