2012-06-21 146 views
3

我的要求是創建一個動態報告pdf文件,其中包含一些來自數據庫的數據,我使用iText來創建它。 現在,我想在菜單,頁眉,頁腳等網頁上內嵌顯示這個pdf文件。Struts2在jsp中顯示pdf文件

所以,如果用戶有一些pdf查看器,那麼這個pdf應該顯示在用戶機器上,並帶有打印選項來打印那個pdf。

+0

有你確信你設置頁眉響應,顯示內容內嵌?無論如何,它不會傷害,如果你張貼一些代碼,並解釋什麼是不使用它... –

+0

[Here](http://stackoverflow.com/questions/12265702/pdf-generation-using-itext-in-struts -2-result-type-stream-not-working)是使用iText和'HttpServletResponse OutputStream'的答案。 – silver

回答

8

這就是我如何做到的。你可以調用一個iframe中或在常規的JSP

public class GeneratePdf extends ActionSupport{ 
    private InputStream inputStream; 
    public String execute(){ 
     HttpServletResponse response = ServletActionContext.getResponse(); 
     Document document = new Document(); 
     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
     try { 
      PdfWriter.getInstance(document, buffer); 
      document.open(); 
         // do your thing 
      document.close(); 
     } catch (DocumentException e) { 
      e.printStackTrace(); 
     } 

     byte[] bytes = null; 
     bytes = buffer.toByteArray(); 
     response.setContentLength(bytes.length); 

     if(bytes!=null){ 
      inputStream = new ByteArrayInputStream (bytes); 
     } 
return SUCCESS; 
} 

public InputStream getInputStream() { 
     return inputStream; 
    } 
} 

這個動作在你的struts.xml

<action name="GeneratePdf" class="com.xxx.action.GeneratePdf"> 
    <result name="success" type="stream"> 
      <param name="contentType">application/pdf</param> 
      <param name="inputName">inputStream</param> 
      <param name="contentDisposition">filename="test.pdf"</param> 
      <param name="bufferSize">1024</param> 
    </result> 
    </action> 
+0

這個參數應該來自GeneratePdf類,尤其是contentDisposition,以便具有不同的pdf名稱。如果你在GeneratePdf中有方法public String getContentDisposition(),你會得到這樣的參數: {{contentDisposition} – Zemzela

+0

@Zemzela沒錯。這只是一個例子,顯示OP如何進行基本設置。我沒有提到filename param,因爲我沒有在action類中顯示它的getter。 – anu

+0

我犯了一個錯誤,只是爲了解決它: filename = $ {contentDisposition} – Zemzela

0
public ByteArrayInputStream generatePDF(List<Object> items) { 

    try { 

     List<InputStream> listInputStream = new ArrayList<InputStream>(); 
     for (int i = 0; i < items.size(); i++) { 
      listInputStream.add(new ByteArrayInputStream(getBytes(items.get(i))); 
     } 

     HttpServletResponse response = ServletActionContext.getResponse(); 
     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
     Document document = new Document(); 

     PdfWriter writer = PdfWriter.getInstance(document, buffer); 
     document.open(); 
     PdfContentByte cb = writer.getDirectContent(); 

     for (InputStream inputStream : listInputStream) { 

      PdfReader reader = new PdfReader(inputStream); 

      for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
       document.setPageSize(reader.getPageSize(i)); 
       document.newPage(); 
       PdfImportedPage page = writer.getImportedPage(reader, i); 
       cb.addTemplate(page, 0, 0); 
      } 
     } 

     document.close(); 

     byte[] bytes = null; 
     bytes = buffer.toByteArray(); 
     response.setContentLength(bytes.length); 

     return new ByteArrayInputStream(bytes); 

    } catch(Exception e){ 
     System.out.println(e); 
    } 

}