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(); 
} 
+0

方法名稱應該以小寫字母開頭 – steven35 2014-10-31 17:27:12

+0

@ steven35方法被調用並執行,這不是問題 – Mario 2014-10-31 17:41:53

+0

我知道。只是說 – steven35 2014-10-31 17:43:30

回答

0

強制瀏覽器以顯示下載對話框,設置內容類型爲「application /八位字節流」:

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

如果你將其設置爲「application/PDF」,一些瀏覽器將嘗試內聯打開PDF或啓動另一個應用程序來查看它。

您可能還需要設置內容長度,使瀏覽器可以知道文件大小前期,如:

response.setContentLength(pdfData.length()); 

不知道它的問題,但是看着我的代碼,它調用output.flush()代替output.close()最後。如果它仍然不起作用,您可能想嘗試。

+0

仍然沒有工作,我試過一切。我認爲我的facecontext可能有問題 – Mario 2014-11-03 16:33:40

+0

如何從客戶端調用它?確保它沒有被Ajax請求調用。 – 2014-11-03 17:23:38

+0

<冰:的commandButton \t \t \t \t \t \t \t \t ID = 「generatePDF」 \t \t \t \t \t \t \t \t值= 「#{味精[ 'label.button.pdf']}」 \t \t \t \t \t \t \t \t actionListener =「#{ExpBean.generatePDF}」 \t \t \t \t \t \t \t \t rendered =「#{ExpBean.visibleButtonPDF}」/> – Mario 2014-11-03 17:44:45