StrutsのActionServletからiTextのPDFを出力する

iTextを用いてJava ServletからPDFを作成するに関連する話題です。

iTextを用いてServletからPDFを出力することは、上記の記事で学習いたしました。
しかし、Strutsの場合、作成したPDFを出力させる機構がすぐに思いつきませんでした。

Strutsのアクションサーブレットは、サーブレットファイルに以下のようなメソッドの中でビジネスロジックを記述しますよね。

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  ...
  return mapping.findForward("ok");
}
「mapping#findForward(文字列)」の部分でstruts-config.xmlの指定した文字列のJSPに飛ばすことで、MVC(Model-View-Controller)モデルを実現しているわけです。

しかし、今回、StrutsでiTextのPDFを出力する場合はそうも言ってられません。
だからと言って、StrutsのActionサーブレットなのにdoPost()やらdoGet()やらを呼び出す方法にしてしまうのはStrutsの意味がなくなってしまいます。

そこでちょっと調べてみましたが、ActionServletからファイルを出力する方法は普通に存在するみたいです。

天使やカイザーと呼ばれて - Strutsでのファイルダウンロードの方法

なるほど。
ActionServletの「return mapping#findForward(文字列);」を「return null;」にし、その前の行に、HTMLソースやバイトコードを出力するようにすれば、HTMLだろうと、ファイルだろうとStrutsから出力できるようです。
CodeZineのiTextを利用してJavaからPDF形式の帳票を出力するのソースを参考に、StrutsからiTextのPDFを出力するための基本体系を書いておきます。

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

  //出力用のStreamをインスタンス化します。
  ByteArrayOutputStream byteout = new ByteArrayOutputStream();

  //文書オブジェクトを生成
  //ページサイズを設定します。
  Document doc = new Document(PageSize.A4, 50, 50, 50, 50);

  try {
    //アウトプットストリームをPDFWriterに設定します。
    PdfWriter pdfwriter = PdfWriter.getInstance(doc, byteout);
  }

  ...

  // PDFの出力を終了します。
  doc.close();

  response.setContentType("application/pdf");
  response.setContentLength(byteout.size());
  OutputStream out = response.getOutputStream();
  out.write(byteout.toByteArray());
  out.close();

  return null;
}

赤字が今回学習の範囲ですw
非常に簡単ですね。

そんなわけで、今後のPDF出力プログラム作成時に使用させていただきます。