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();
}
}