2009年8月15日土曜日

iTextで表を作成する方法

iTextを使用して、XMLに記述したレイアウト情報からPDFを出力してみた。

itext.dtd によると、table要素のdtd定義は、<!ELEMENT table (cell*)> となっているのだが、table要素とcell要素の間に、row要素が無いと正しく動作しないようだ。

Javaソース

import java.io.*;
import javax.xml.parsers.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import com.lowagie.text.xml.*;

中略

Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
OutputStream out = new FileOutputStream("forxml.pdf");
PdfWriter pdfwriter = PdfWriter.getInstance(doc, out);

BaseFont jfont = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);
SAXiTextHandler xmlHandler = new SAXiTextHandler(doc, null, jfont);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new FileInputStream("itext.xml"), xmlHandler);


XMLファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE itext SYSTEM "http://itext.sourceforge.net/itext.dtd">
<itext>
<paragraph size="10">
<phrase>iTextサンプル</phrase>
</paragraph>
<table width="100%" widths="25;25;50" columns="3" borderwidth="1.0"
left="true" right="true" top="true" bottom="true">
<row>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">id</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">名前</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">部署</cell>
</row>
<row>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">xxx</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">なまえ</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">xxx部</cell>
</row>
</table>
</itext>