我的需求是使用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参数(参见下面的配置)
<action name="exportReport" class="com.export.ExportReportAction">
<result name="pdf" type="stream">
<param name="inputName">inputStream</param>
<param name="contentType">application/pdf</param>
<param name="contentDisposition">attachment;filename="sample.pdf"</param>
<param name="bufferSize">1024</param>
</result>
</action>我知道我的类应该有inputStream的getter和setter,我在struts-configuration中提到的类中也有。
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}但是由于iText实际上并不需要输入流,而是直接写入响应的输出流,所以我得到了异常,因为我没有为inputstream参数设置任何内容。
请告诉我如何在以resultType为流的struts-2中使用iText代码
谢谢
发布于 2012-09-04 23:19:29
找到了这个问题的解决方案。
执行此PDF导出的操作中的方法可以为void。当我们直接写入响应的outputstream时,不需要进行结果类型配置
例如,让您的action类如下所示
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
<action name="exportReport" class="com.export.ExportReportAction">
<!-- NO NEED TO HAVE RESULT TYPE STREAM CONFIGURATION-->
</action>这很酷!
感谢所有试图回答这个问题的人
发布于 2014-12-01 14:10:12
主要答案:
您还可以按照Apache文档中的说明使用return NONE或return null:
从操作类方法返回ActionSupport.NONE (或null)会导致跳过结果处理。如果操作完全处理结果处理,例如直接写入HttpServletResponse OutputStream,这将非常有用。
来源: http://struts.apache.org/release/2.2.x/docs/result-configuration.html
示例:
O‘’Reilly提供了一个使用Servlets的Dynamically Creating PDFs in a Web Application教程(S.C.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;
}
}现在您可以在您的action类中调用它。
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
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>struts.xml**:**
<action name="viewpdf" class="com.yoursite.action.ViewPDFAction">
<!-- NO CONFIGURATION FOR RESULT NONE -->
</action>https://stackoverflow.com/questions/12265702
复制相似问题