Java 在Struts-2中使用iText生成PDF:结果类型流不工作
我的要求是使用iText生成PDF文件,我使用下面的代码创建一个示例PDFJava 在Struts-2中使用iText生成PDF:结果类型流不工作,java,jakarta-ee,pdf,struts2,itext,Java,Jakarta Ee,Pdf,Struts2,Itext,我的要求是使用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")); docume
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参数,而是直接写入响应的outputstream。而struts-2要求我们使用InputStream参数(参见下面的配置)
但由于iText实际上并不需要inputstream,而是直接写入响应的outputstream,因此我得到了异常,因为我没有为inputstream参数设置任何内容
请告诉我如何在struts-2中使用iText代码,并将结果类型作为流
感谢您找到了此问题的解决方案 执行此PDF导出的操作中的方法可能无效。当我们直接写入响应的outputstream时,不需要结果类型配置 例如,以这种方式设置动作类
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>
这个很酷
感谢所有试图回答此问题的人主要答案:
您还可以返回NONE
或返回null
,如Apache文档中所述:
从action类方法返回ActionSupport.NONE(或null)
导致跳过结果处理。如果
操作完全处理结果处理,例如直接写入
HttpServletResponse输出流
来源:
例子: O'Reilly提供了一个关于使用servlet的教程(S.C.Sullivan,2003)。它可以转换为Struts2动作类,如下所示 最好有一个像
PDFGenerator
这样的助手类来为您创建PDF,并将其作为ByteArrayOutputStream
返回
PDFGenerator
class:
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;
}
}
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;
}
}
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
你现在可以在你的动作课上调用它
查看更新
类:
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;
}
}
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;
}
}
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
web.xml
:
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;
}
}
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;
}
}
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
你得到了非法的州例外吗?是的,柴坦尼亚。。你是对的。我得到非法状态异常,要求我检查是否已删除我的答案。看来我错了。如前所述,我不熟悉struts您可以从输出流创建inputstream:
setInputStream(newbytearrayinputstream(baos.toByteArray())代码>单击并使用Dave Newton的建议寻找解决方案。在我看来,这不是一个很好的解决方案,尽管它很有效。S2为此提供了一种机制,即流结果,它应该优先于在Java代码中手动执行所有操作。@DaveNewton:S2的resultType stream总是在代码中查找要填充的Java.io.InputStream对象。当您从文件系统或任何其他输入系统读取PDF文件时,可以填充Inputstream。而iText创建一个PDF文件,并将其直接写入响应的输出流。在这种情况下,我们不需要任何inputstream,也不需要任何inputstream来编写。所以这个解决方案听起来不错:-)从输出流获取输入流是一个单行程序。通过XML,配置更加灵活,并针对系统的其余部分进行规范化。我不是说永远不要直接给回复写信,但是当你不需要的时候,这似乎是浪费。不管怎样。更新了PDF生成的答案。