0

我在实现一种生成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();
}
4

1 回答 1

0

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

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

如果您将其设置为“application/pdf”,某些浏览器会尝试打开内联 PDF 或启动另一个应用程序来查看它。

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

response.setContentLength(pdfData.length());

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

于 2014-10-31T18:29:50.707 回答