TomcatでPDF

iTextを使って, PDFを作成してみる.


まずは設定から.
以下のサイトからitext-1.4.3.jarをダウンロード.

                                                                                                                      • -

iText, a Free Java-PDF Library: Download & Compile
http://www.lowagie.com/iText/download.html

                                                                                                                      • -



日本語を扱うために, 以下のサイトからiTextAsian.jarをダウンロード.

                                                                                                                      • -

Early Access iText (version itext-paulo-155)
http://itextpdf.sourceforge.net/

                                                                                                                      • -



これらのjarファイルをCLASSPATHに加える.
自分の場合は, ~/lib/java以下に配置して加えた.

# iTextの設定
setenv CLASSPATH $HOME/lib/java/itext-1.4.3.jar:$CLASSPATH
setenv CLASSPATH $HOME/lib/java/iTextAsian.jar:$CLASSPATH

もしかしたら, tomcatの中に置いたほうがいいのかもしれないけど(libディレクトリとか)今はこれでいいや.
やりながら書いてたから追記.
$CATALINA_HOME/common/lib/以下に上記2つのjarファイルを置いとかないと駄目っぽい.


とりあえず, 参考にしたサイトにあったサンプルをそのまま使ってテストしてみる.
こんにちは, 世界. と表示するだけのプログラム, PdfServlet.java.

import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

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

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;

public class PdfServlet extends HttpServlet
{
    protected void doGet( HttpServletRequest request, HttpServletResponse response )
        throws ServletException, IOException
    {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();

        // 汎用の文書オブジェクトを生成 (1)
        Document doc = new Document();
        try {
            // 出力先を指定し、文書をPDFとして出力 (2)
            PdfWriter.getInstance( doc, byteOut );
            // 出力開始 (3)
            doc.open();
            // 日本語フォントの設定
            Font font = new Font( BaseFont.createFont( "HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED ) );
            // 文書に要素を追加  (4)
            doc.add( new Paragraph( "こんにちは、世界。", font ) );
        }catch( FileNotFoundException e ){
            e.printStackTrace();
        }catch( DocumentException e ){
            e.printStackTrace();
        }
        // 出力終了  (5)
        doc.close();

        // ブラウザへの出力
        response.setContentType( "application/pdf" );
        response.setContentLength( byteOut.size() );

        OutputStream out = response.getOutputStream();

        out.write( byteOut.toByteArray() );
        out.close();
    }
}

これをjavac PdfServlet.javaコンパイルしてやる.
うん. 問題なくOK.
参考にしたサイトのには, この↑最初の2行が無いからエラーが出たけど.


Tomcatでこのサーブレットファイルを実行するためにweb.xmlにこんなのを追加.
これ面倒くさいけどどうにかなんないかなあ.

 <!-- PdfServlet.java  -->
  <servlet>
    <servlet-name>PdfSample</servlet-name>
    <servlet-class>PdfServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>PdfSample</servlet-name>
    <url-pattern>/PdfSample</url-pattern>
  </servlet-mapping>

さて, できるかな?


何とかできた.
表示できた.
次は表とかに挑戦だ.
どうも, Tomcat介さなくても普通に作成できるっぽい.
でも, HTML->PDFといけたら面白いよなあ.


なんかサーブレットファイルをコンパイルして, いざ実行ってなっても毎回1回目, 上手くいかないのね.
今までのとか全部, サーブレットだけ動かない.
tomcatを再起動したり, ブラウザを再起動したりしてたら動くようになるけど, 何でだろう?
やりづらくてしょうがない.
Javaファイルがパッケージ指定してないからかなあ?
よくわかんないや.