なんじゃくにっき

プログラミングの話題中心。

GAE/JアプリでPDF出力(1)

Google App Engine for Java上のWEBアプリでPDFを出力しようと思ったのだが、
色々問題が出てきた。
 
iText 5
 JavaでPDFを出力する、という話になったときまず出てくるのがiTextだが、
最新版であるiText 5.x系統はライセンスがAGPL
 
iText 2
 前バージョンであるiText 2.x系統だとライセンスはMPL/LGPLのデュアルライセンス。
しかしGAE/Jのブラックリストに載っているAPIを使っているので動かない。
 
Apache FOP
 これもGAE/Jのブラックリストに載っているAPIを使っているので動かない。
 
といったところで困っていたのだが、
森薫さんという方がiText 2.1.7をGAE/Jで動くようにModifyしてくれていた。感謝です。
http://d.hatena.ne.jp/kaorumori/20090824/1251123510
 
また、日本語を扱うためにここからiTextAsian.jarもダウンロードしてパスを通す。




使用例
package test.page;

import java.io.ByteArrayOutputStream;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.t2framework.commons.annotation.composite.RequestScope;
import org.t2framework.commons.util.Logger;
import org.t2framework.t2.annotation.core.Default;
import org.t2framework.t2.annotation.core.Page;
import org.t2framework.t2.spi.Navigation;
import org.t2framework.t2.navigation.NoOperation;

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

@Page("/pdf")
@RequestScope
public class PDFPage {
@SuppressWarnings("unused")
private static Logger logger = Logger.getLogger(PDFPage.class);

@Default
public Navigation pdf(HttpServletResponse response) throws Exception{

// 用紙サイズと余白を指定してドキュメント生成
Document doc = new Document(PageSize.A4, 30, 30, 30, 30);
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
PdfWriter.getInstance(doc, byteout);

doc.open();
// ベースフォント指定
BaseFont basefont = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", false);
// フォントを指定して文章追加
doc.add(new Paragraph("日本語も出力できますよっと", new Font(basefont, 12)));
doc.close();

response.setContentType("application/pdf");
response.setContentLength(byteout.size());
ServletOutputStream out = response.getOutputStream();
out.write(byteout.toByteArray());

return NoOperation.noOp();
}
}