在Struts-2中使用iText生成PDF:结果类型流不起作用

我的要求是使用iText生成PDF文件,我使用下面的代码创建一个示例PDF

Document document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter.getInstance(document, baos); document.open(); document.add(new Paragraph("success PDF FROM STRUTS")); document.close(); ServletOutputStream outputStream = response.getOutputStream() ; baos.writeTo(outputStream); response.setHeader("Content-Disposition", "attachment; filename=\"stuReport.pdf\""); response.setContentType("application/pdf"); outputStream.flush(); outputStream.close(); 

如果您在上面的代码中看到,iText没有使用任何inputStream参数,而是直接写入响应的输出流。 struts-2强制我们使用InputStream参数(参见下面的配置)

   inputStream application/pdf attachment;filename="sample.pdf" 1024   

我知道我的类应该有inputStream的getter和setter,我也有struts-configuration中提到的类

 private InputStream inputStream; public InputStream getInputStream() { return inputStream; } public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } 

但由于iText并不真正需要输入流,而是直接写入响应的输出流,因此我得到了exception,因为我没有为inputStream参数设置任何内容。

请告诉我如何在struts-2中使用具有resultType作为流的iText代码

谢谢

找到解决方案。

执行此PDF导出的操作中的方法可能无效。 在我们直接写入响应的输出流时,不需要结果类型配置

例如,以这种方式使用您的动作类

 Class ExportReportAction extends ActionSupport { public void exportToPdf() { // no return type try { Document document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter.getInstance(document, baos); document.open(); document.add(new Paragraph("success PDF FROM STRUTS")); document.close(); ServletOutputStream outputStream = response.getOutputStream() ; baos.writeTo(outputStream); response.setHeader("Content-Disposition", "attachment; filename=\"stuReport.pdf\""); response.setContentType("application/pdf"); outputStream.flush(); outputStream.close(); }catch (Exception e) { //catch } } } 

并以这种方式配置你的struts

    

这很酷!

感谢所有试图回答这个问题的人

主要答案:

您也可以return NONEreturn null如Apache文档中所述:

从操作类方法返回ActionSupport.NONE(或null)会导致跳过结果处理。 如果操作完全处理结果处理(例如直接写入HttpServletResponse OutputStream),这将非常有用。

资料来源: http //struts.apache.org/release/2.2.x/docs/result-configuration.html


例:

O’Reilly提供了使用Servlet 在Web应用程序中动态创建PDF的教程(SC Sullivan,2003)。 它可以转换为Struts2动作类,如下所示。

最好有一个像PDFGenerator这样的辅助类来为你创建PDF并将其作为ByteArrayOutputStream返回。

PDFGenerator

 import java.io.ByteArrayOutputStream; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; public class PDFGenerator { public ByteArrayOutputStream generatePDF() throws DocumentException { Document doc = new Document(); ByteArrayOutputStream baosPDF = new ByteArrayOutputStream(); PdfWriter pdfWriter = PdfWriter.getInstance(doc, baosPDF); try { doc.open(); // create pdf here doc.add(new Paragraph("Hello World")); } catch(DocumentException de) { baosPDF.reset(); throw de; } finally { if(doc != null) { doc.close(); } if(pdfWriter != null) { pdfWriter.close(); } } return baosPDF; } } 

您现在可以在动作类中调用它。

ViewPDFAction

 import java.io.ByteArrayOutputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletResponseAware; import com.yoursite.helper.PDFGenerator; import com.opensymphony.xwork2.ActionSupport; public class ViewPDFAction extends ActionSupport implements ServletResponseAware { private static final long serialVersionUID = 1L; private HttpServletResponse response; @Override public String execute() throws Exception { ByteArrayOutputStream baosPDF = new PDFGenerator().generatePDF(); String filename = "Your_Filename.pdf"; response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "inline; filename=" + filename); // open in new tab or window response.setContentLength(baosPDF.size()); OutputStream os = response.getOutputStream(); os.write(baosPDF.toByteArray()); os.flush(); os.close(); baosPDF.reset(); return NONE; // or return null } @Override public void setServletResponse(HttpServletResponse response) { this.response = response; } } 

web.xml

  pdf application/pdf  

struts.xml