4

私の要件は、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パラメーターを使用しておらず、応答のoutputstreamに直接書き込んでいます。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のゲッターとセッターが必要であり、struts-configurationで言及されているクラスにもそれがあります。

private InputStream inputStream;
public InputStream getInputStream() {
    return inputStream;
}

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

しかし、iTextは実際にはinputstreamを必要とせず、応答のoutputstreamに直接書き込んでいるため、inputStreamパラメーターに何も設定していないため、例外が発生します。

resultTypeをストリームとして持つstruts-2でiTextコードを使用する方法を教えてください

ありがとう

4

2 に答える 2

4

これに対する解決策が見つかりました。

この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
    }

  } 
}

ストラットをこのように構成します

<action name="exportReport" class="com.export.ExportReportAction"> 
 <!-- NO NEED TO HAVE RESULT TYPE STREAM CONFIGURATION-->
</action>

これはクールに動作します!!!

この質問に答えようとしたすべての人に感謝します

于 2012-09-04T15:19:29.250 に答える
2

主な回答:

またreturn NONEreturn nullApacheドキュメントで説明されているように:

アクションクラスメソッドからActionSupport.NONE(またはnull)を返すと、結果の処理がスキップされます。これは、アクションがHttpServletResponseOutputStreamへの直接書き込みなどの結果処理を完全に処理する場合に役立ちます。

ソース: http ://struts.apache.org/release/2.2.x/docs/result-configuration.html


例:

O'Reillyは、サーブレットを使用してWebアプリケーションでPDFを動的に作成するためのチュートリアルを提供しています(SC Sullivan、2003年)。以下に示すように、Struts2アクションクラスに変換できます。

PDFGeneratorPDFを作成して、として返すようなヘルパークラスがあると便利です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

<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>
于 2014-12-01T06:10:12.287 に答える