我的要求是創建一個動態報告pdf文件,其中包含一些來自數據庫的數據,我使用iText來創建它。 現在,我想在菜單,頁眉,頁腳等網頁上內嵌顯示這個pdf文件。Struts2在jsp中顯示pdf文件
所以,如果用戶有一些pdf查看器,那麼這個pdf應該顯示在用戶機器上,並帶有打印選項來打印那個pdf。
我的要求是創建一個動態報告pdf文件,其中包含一些來自數據庫的數據,我使用iText來創建它。 現在,我想在菜單,頁眉,頁腳等網頁上內嵌顯示這個pdf文件。Struts2在jsp中顯示pdf文件
所以,如果用戶有一些pdf查看器,那麼這個pdf應該顯示在用戶機器上,並帶有打印選項來打印那個pdf。
這就是我如何做到的。你可以調用一個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>
這個參數應該來自GeneratePdf類,尤其是contentDisposition,以便具有不同的pdf名稱。如果你在GeneratePdf中有方法public String getContentDisposition(),你會得到這樣的參數: {{contentDisposition} – Zemzela
@Zemzela沒錯。這只是一個例子,顯示OP如何進行基本設置。我沒有提到filename param,因爲我沒有在action類中顯示它的getter。 – anu
我犯了一個錯誤,只是爲了解決它: filename = $ {contentDisposition} – Zemzela
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);
}
}
有你確信你設置頁眉響應,顯示內容內嵌?無論如何,它不會傷害,如果你張貼一些代碼,並解釋什麼是不使用它... –
[Here](http://stackoverflow.com/questions/12265702/pdf-generation-using-itext-in-struts -2-result-type-stream-not-working)是使用iText和'HttpServletResponse OutputStream'的答案。 – silver