我很难实现一个生成pdf的方法然后显示另存为选择文件路径的对话框,我的代码中有什么问题?
public void generatePDF(ActionEvent ev) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter.getInstance(document, baos);
document.open();
...
document.close();
// Prepare.
byte[] pdfData = baos.toByteArray();
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
// Initialize response.
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-disposition","attachment;filename=\"ResumenEjecutivo.pdf\"");
// Write file to response.
OutputStream output = response.getOutputStream();
output.write(pdfData);
output.close();
// Inform JSF to not take the response in hands.
facesContext.responseComplete();
}
答案 0 :(得分:0)
要强制浏览器显示下载对话框,请将内容类型设置为" application / octet-stream":
response.setContentType("application/octet-stream");
如果您将其设置为" application / pdf",某些浏览器会尝试打开内联PDF或启动其他应用程序进行查看。
您可能还想设置内容长度,以便浏览器可以预先知道文件大小,例如:
response.setContentLength(pdfData.length());
不确定是否重要,但查看我的代码,最后会调用output.flush()
而不是output.close()
。如果它仍然不起作用,你可能想尝试一下。