既存のPDF文書にコンテンツを追記するには:JavaTips 〜JSP/サーブレット編
「PD文書を生成する(PDFLib)」では、PDFLibライブラリを利用してサーブレットクラスからPDF文書を生成する方法を紹介しました。しかし、例えば複雑な帳票イメージを1から動的に生成したり、帳票に変更が生じた場合の変更はサーバに大きな負荷をかけることになります。そこで、定型的な部分をあらかじめ「テンプレート」として用意しておき、動的なPDFの生成を部分的にとどめる方法が解決方法として考えられます。
使用する「テンプレート」を「template.pdf」という名前で、アプリケーション・ルートの配下に配置します。以下は、今回利用するtemplate.pdfの中身です。
テンプレートとなるPDF文書
テンプレートを引用しつつ、新規にPDF文書を作成する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メソッドでダミーのページを作成しておく必要がある点に注意してください。
このサーブレットクラスを実行する前に、あらかじめデプロイメント・ディスクリプタ(web.xml)に対してサーブレットの登録を行う必要があります。<url-pattern>要素に「/result.pdf」のように指定しておくことで、サーブレットクラスをあたかも静的なPDFファイルであるかのように見せることができます(基礎から学ぶサーブレット/JSP 第11回「JSPとサーブレットの違いを明らかにする」)も合わせて参照してください)。
<?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 © ITmedia, Inc. All Rights Reserved.