2007年12月2日日曜日

ZK: iText

Report with ZK : Using JasperReports As an Exampleを参考に動的にPDFファイルを作成するサンプルを作ってみました。
PDF作成にはiTextライブラリを使います。まずこちらのサイトからjarファイルをダウンロードします。日本語を使うためにこちらのサイトからiTextAsian.jarをダウンロードします。
次にダウンロードしたjarファイルをWEB-INF/libへインポートして準備完了です。

<?xml version="1.0" encoding="UTF-8"?>
<?page style="height:100%" ?>
<zk xmlns="http://www.zkoss.org/2005/zul" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd ">
<window width="100%" height="100%">
<borderlayout height="100%">
<north maxsize="24" size="24" border="0">
<hbox>
名前:<textbox id="name"/>
<button label="PDF出力" onClick="doReport()"/>
</hbox>
</north>
<center border="none" flex="true">
<iframe id="report" />
</center>
</borderlayout>
<zscript><![CDATA[
import java.io.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import org.zkoss.util.media.AMedia;
import java.awt.Color;

void doReport() {
try {
//iTextでは出力するPDF全体はDocumentクラスで表現される
Document doc = new Document();
//ゴシック体の日本語ベースフォント作成
BaseFont bf_goth = BaseFont.createFont(
"HeiseiKakuGo-W5", //ゴシック体
"UniJIS-UCS2-H", //横書日本語Unicodeエンコーディング
BaseFont.NOT_EMBEDDED);
//明朝体の日本語ベースフォント作成
BaseFont bf_min = BaseFont.createFont(
"HeiseiMin-W3", //明朝体
"UniJIS-UCS2-H", //横書日本語Unicodeエンコーディング
BaseFont.NOT_EMBEDDED);

//日本語フォント作成
Font font_goth = new Font(bf_goth);
Font font_min15 = new Font(bf_min, 15); //明朝体 15pt
Font font_goth8red = new Font(bf_goth, 8); //ゴシック体8pt
font_goth8red.setColor(new Color(255,0,0)); //文字色を赤に設定

//出力用のStreamをインスタンス化し
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
//PDFの出力先へ割り当てる。
PdfWriter.getInstance(doc, byteout);

doc.open();
//本文を追加
doc.add(new Paragraph(name.value + "さん、 " + "こんにちは!!" , font_goth));
doc.add(new Paragraph(name.value + "さん、 " + "こんにちは!!" , font_min15));
doc.add(new Paragraph(name.value + "さん、 " + "こんにちは!!" , font_goth8red));
doc.close();

//PDF出力から入力ストリームを作成し
final InputStream mediais = new ByteArrayInputStream(byteout.toByteArray());
//入力ストリームをiframeのコンテンツへ媒介するAMediaオブジェクトを生成
final AMedia amedia =
new AMedia("FirstReport.pdf", "pdf", "application/pdf", mediais);

//iframeにコンテンツをセット
report.setContent(amedia);
}catch (IOException e) {
e.printStackTrace();
}catch (DocumentException e) {
e.printStackTrace();
}
}
]]></zscript>
</window>
</zk>

0 件のコメント: