連載
» 2005年03月23日 10時00分 UPDATE

JavaTips 〜JSP/サーブレット編:既存のPDF文書にコンテンツを追記するには

[山田祥寛,@IT]

 「PD文書を生成する(PDFLib)」では、PDFLibライブラリを利用してサーブレットクラスからPDF文書を生成する方法を紹介しました。しかし、例えば複雑な帳票イメージを1から動的に生成したり、帳票に変更が生じた場合の変更はサーバに大きな負荷をかけることになります。そこで、定型的な部分をあらかじめ「テンプレート」として用意しておき、動的なPDFの生成を部分的にとどめる方法が解決方法として考えられます。

(1)テンプレートPDFを用意する

 使用する「テンプレート」を「template.pdf」という名前で、アプリケーション・ルートの配下に配置します。以下は、今回利用するtemplate.pdfの中身です。

テンプレートとなるPDF文書 テンプレートとなるPDF文書

(2)サーブレットクラスを作成する

 テンプレートを引用しつつ、新規にPDF文書を作成するPdfTemplate.javaを定義してみましょう。

PdfTemplate.java
package to.msn.wings.javatips;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.pdflib.PDFlibException;
import com.pdflib.pdflib;

public class PdfTemplate extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    pdflib objPdf=null;
    try {
      objPdf=new pdflib();
      objPdf.begin_document("", "");
      objPdf.set_info("Author","Y.Yamada");
      int intPdi=objPdf.open_pdi(getServletContext().
getRealPath("/template.pdf"),"",0);

      int intFnt=objPdf.load_font("HeiseiMin-W3","UniJIS-UCS2-H","");
      objPdf.begin_page_ext(10,10,"");
      int intPag=objPdf.open_pdi_page(intPdi,1,"");
      objPdf.fit_pdi_page(intPag, 0, 0, "adjustpage");
      objPdf.close_pdi(intPdi);

      objPdf.setfont(intFnt,18);
      objPdf.set_value("leading",20);
      objPdf.set_text_pos(10,650);
      objPdf.show("PDFLibの");
      objPdf.continue_text("サンプルです。");
      objPdf.end_page_ext("");
      objPdf.end_document("");
      byte[] buf = objPdf.get_buffer();
      response.setContentType("application/pdf;charset=Windows-31J");
      response.setHeader("Content-disposition","attachment; filename=result.pdf");
      response.setContentLength(buf.length);
      ServletOutputStream objOut=response.getOutputStream();
      objOut.write(buf);
      objOut.close();
    } catch (PDFlibException e) {
      e.printStackTrace();
    } finally {
      if(objPdf!=null){objPdf.delete();}
    }
  }
}


 「PD文書を生成する(PDFLib)」で紹介したPdfGenerateクラスから変更されているのは、赤字の部分です。テンプレートを利用するには、open_pdiメソッドで呼び出したテンプレート・ファイルを基にページ・イメージを生成した後(open_pdi_pageメソッド)、fit_pdi_pageでページに対して適用するだけです。テンプレートを適用するに際しては、あらかじめbegin_page_extメソッドでダミーのページを作成しておく必要がある点に注意してください。

(3)デプロイメント・ディスクリプタにサーブレットクラスを登録する

 このサーブレットクラスを実行する前に、あらかじめデプロイメント・ディスクリプタ(web.xml)に対してサーブレットの登録を行う必要があります。<url-pattern>要素に「/result.pdf」のように指定しておくことで、サーブレットクラスをあたかも静的なPDFファイルであるかのように見せることができます(基礎から学ぶサーブレット/JSP 第11回「JSPとサーブレットの違いを明らかにする」)も合わせて参照してください)。

web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  version="2.4">
  ……中略……
  <servlet>
    <servlet-name>PdfTemplate</servlet-name>
    <servlet-class>to.msn.wings.javatips.PdfTemplate</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PdfTemplate</servlet-name>
    <url-pattern>/result.pdf</url-pattern>
  </servlet-mapping>
  ……中略……
</web-app>


 このコードの実行結果は、以下のようになります。テンプレート・ファイルであるtemplate.pdfに文字列が追記されたPDF文書が生成されているのが確認できます。

実行結果 実行結果

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。