Birt版有两个输出流

时间:2015-02-24 16:01:18

标签: java-ee pdf-generation birt outputstream

我有一个从Java EE应用程序启动的birt版本,当用户启动动作时,pdf生成在新窗口中启动,所有这些都运行良好,我想做的更改是这样的:我想保持不变pdf在我的服务器中稍后通过电子邮件发送。

PDFRenderOption pdfOptions = new PDFRenderOption(options);
pdfOptions.setOutputFormat("pdf");
options.setSupportedImageFormats("JPG;BMP;PNG;JPEG");
pdfOptions.setOutputFileName(OUTPUT_LOCATION + "project/exportprojet.pdf");
pdfOptions.setOutputStream(response.getOutputStream());
runAndRenderTask.setRenderOption(pdfOptions);

添加pdfOptions.setOutputFileName(OUTPUT_LOCATION + "project/exportprojet.pdf");后,pdf会在服务器中生成并存储,但之前的工作原理不再有效,会向用户启动一个新窗口并且不显示pdf,看起来像是添加了line生成了pdf并通过阻止它转到用户来放入服务器

2 个答案:

答案 0 :(得分:2)

不支持同时使用setOutputFileNamesetOutputStream

但解决方案很明显: 只需将PDF生成到文件系统(使用setOutputFileName),等到RunAndRenderTask完成,然后将文件的内容(二进制)复制到response.getOutputStream。< / p>

答案 1 :(得分:0)

hvb提出的解决方案的实施在我的旧代码更改后完美运行:

 PDFRenderOption pdfOptions = new PDFRenderOption(options);
String sUrlExportFile = OUTPUT_LOCATION + "projet/" + idProjetAGenerer + "/exportprojet.pdf";
pdfOptions.setOutputFormat("pdf");
options.setSupportedImageFormats("JPG;BMP;PNG;JPEG");
pdfOptions.setOutputFileName(sUrlExportFile);
runAndRenderTask.setRenderOption(pdfOptions);
runAndRenderTask.getAppContext().put(EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request);
runAndRenderTask.run();
runAndRenderTask.close();
//copy the genereted file to response.getOutputStream()
File f = new File(sUrlExportFile);
InputStream inputStream = null;
try {
    inputStream = new FileInputStream(f);
    IOUtils.copy(inputStream, response.getOutputStream());
} finally {
    IOUtils.closeQuietly(inputStream);
}