带有两个输出流的 Birt 版本

Birt edition with two output streams

我有一个从 Java EE 应用程序启动的 birt 版本,当用户启动操作时,pdf 生成会在新的 window 中启动,一切正常,我想更改make 是这样的:我想在我的服务器中保留相同的 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生成并存储在服务器中,但之前的工作不再工作,向用户启动新的window,pdf不显示,看起来添加的行采用了生成的 pdf 并通过阻止它发送给用户来放入服务器

不支持同时使用setOutputFileNamesetOutputStream

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

提出的解决方案的实施完美无缺,对我的旧代码进行了更改:

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