我有一个从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并通过阻止它转到用户来放入服务器
答案 0 :(得分:2)
不支持同时使用setOutputFileName
和setOutputStream
。
但解决方案很明显:
只需将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);
}