另存为对话框没有弹出

时间:2014-10-31 17:22:51

标签: java servlets pdf-generation document bytearrayoutputstream

我很难实现一个生成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();
}

1 个答案:

答案 0 :(得分:0)

要强制浏览器显示下载对话框,请将内容类型设置为" application / octet-stream":

response.setContentType("application/octet-stream");

如果您将其设置为" application / pdf",某些浏览器会尝试打开内联PDF或启动其他应用程序进行查看。

您可能还想设置内容长度,以便浏览器可以预先知道文件大小,例如:

response.setContentLength(pdfData.length());

不确定是否重要,但查看我的代码,最后会调用output.flush()而不是output.close()。如果它仍然不起作用,你可能想尝试一下。