AS3でpdfを生成するライブラリである、purepdfを試してみました。
purepdfはjavaでのpdf生成ライブラリである、iTextを移植したものとの事。
ダウンロードにはいくつかのサンプルasクラスが用意されていて、すぐに機能を試すことができます。
このpurepdfというライブラリはCJKフォントにも対応していて、フォント埋め込みにも対応しているとのこと。
サンプルでChineseKoreanJapanese.asというその名の通りのものがありますが、こちらは中国語のフォント(CMap.UniGB_UCS2_H)を参照するようになっているので、まるでFlex4のs:Labelクラスで日本語指定したときのように表示されています。
そこで日本語Fontに対応したpdfを作るように変更してみました。
[追記2010/05/11]
Flash Player 10でも動作するようにpatch作成されています。すばらしい!
jp.ferv.blog » Blog Archive » Player10.0 でも purePDF で日本語PDFを作る
http://ferv.jp/blog/2010/05/10/player10-0_purepdf_japanese/
purepdfのサンプルでは、ダブルバイト部分はUnicode参照文字(\uxxxxの形)で記載されていましたが、実際には変換しなくても表示できるようです。
標準で用意されている日本語フォントの指定
purepdfで指定できる日本語フォントはiTextと同様で以下の3つが利用可能です。
フォント名 | 説明 |
KozMinPro-Regular | 明朝体 |
HeiseiMin-W3 | 明朝体 |
HeiseiKakuGo-W5 | ゴシック体 |
今回エンコーディングとの組み合わせで試して表示できたのは以下の組み合わせでした。
// 明朝体 KozMinPro-Regular
Font font1 = new Font(
BaseFont.createFont(
"KozMinPro-Regular", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED),
10, Font.UNDERLINE);// 明朝体 HeiseiMin-W3
Font font2 = new Font(
BaseFont.createFont(
"HeiseiMin-W3", "UniJIS-UCS2-V", BaseFont.NOT_EMBEDDED),
11, Font.NORMAL);// ゴシック体 HeiseiKakuGo-W5
Font font3 = new Font(
BaseFont.createFont(
"HeiseiKakuGo-W5", "UniJIS-UCS2-HW-H", BaseFont.NOT_EMBEDDED),
12, Font.ITALIC);// ゴシック体 HeiseiKakuGo-W5
Font font4 = new Font(
BaseFont.createFont(
"HeiseiKakuGo-W5", "UniJIS-UCS2-HW-V", BaseFont.NOT_EMBEDDED),
13, Font.BOLD);
以下コード例です。
まず最初にCMapを読み込みます。
var map: ICMap = new CMap( new CMap.UniJIS_UCS2_H() );
CMapResourceFactory.getInstance().registerCMap(BaseFont.UniJIS-UCS2-HW-H, map );
次にプロパティをロードしてフォント名を指定します。
var prop: IProperties = new Properties(); prop.load( new BuiltinCJKFonts.HeiseiKakuGo_W5() ); CJKFontResourceFactory.getInstance().registerProperty(BuiltinCJKFonts.getFontName( BuiltinCJKFonts.HeiseiKakuGo_W5 ), prop);
文書を作成してタイトルなどを設定します。
writer = PdfWriter.create( buffer, rect ); document = writer.pdfDocument; document.addAuthor( "NORIDON.net (http://www.noridon.net)" ); document.addTitle( getQualifiedClassName( this ) ); document.addCreator( "http://code.google.com/p/purepdf" ); if( subject ){ document.addSubject( subject ); } document.addKeywords( "itext,purepdf" ); document.setViewerPreferences( PdfViewPreferences.FitWindow );
文書を開きます。
document.open();
登録したフォントのインスタンスを生成してドキュメントにそのフォントを指定した上でパラグラフを追加します。
document.add( new Paragraph("こんにちは、世界!私の名前はカルメンです", font));
最後に文書を閉じて保存します。
document.close(); var f: FileReference = new FileReference(); f.save( buffer, filename );
フォントの埋め込みの指定
フォントを埋め込む場合はpurepdfのサイトにあるwikiページ(FontsHowTo)にサンプルがのっているので、わかりやすいです。
1.まず最初にotfやttfファイルをEmbedして定義します。
[Embed(source="assets/fonts/AoyagiKouzanFont2.ttf", mimeType="application/octet-stream")] private var cls1: Class;
2.次に定義したフォントを登録します。
FontsResourceFactory.getInstance().registerFont("japanese_unicode.otf", new cls1());
3.フォントのインスタンスを生成する際にEMBEDDEDを指定して作成します。
var bf: BaseFont = BaseFont.createFont("japanese_unicode.otf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED );
var font: Font = new Font( -1, 24, -1, RGBColor.BLACK, bf );
4.インスタンス化したフォントを指定してパラグラフを追加します。
document.add( new Paragraph("こんにちは。こんにちはpurepdf。日本語もできます。", font ) );
注意というかハマったのが、現在Flash Player 10だと日本語フォントを指定した際にpdfを生成することができないようです。Adobe LabsにあるFlash Player 10.1 Betaで同じswfをみると動作しました。
--
以下リンク。
■purePDF
//#purepdfはjavaのiTextを移植したものとのこと。
#purepdfのプロジェクトページはgooglecodeでhostされています。
purepdf - Project Hosting on Google Code
http://code.google.com/p/purepdf/
#ASDocはこちら。
All Packages - API Documentation
http://www.sephiroth.it/purepdf/asdoc-output/
#紹介記事。機能一覧
purePDF, a complete actionscript PDF library - sephiroth.it - flash world
http://www.sephiroth.it/weblog/archives/2010/02/purepdf_a_complete_actionscript_pdf_l.php
#日本語による解説はこちら
ActionScript3からPDFを作成出来るライブラリ「purePDF」:phpspot開発日誌
http://phpspot.org/blog/archives/2010/02/actionscript3pd.html
#purepdf以外にもいくつかライブラリがあるみたいです。
クライアントサイドでPDF - Flex Coder
http://d.hatena.ne.jp/sato-shi/20100215/p2
Anaara Media LLC » Blog Archive » Web to Print: Client Side PDF Generation from Adobe Flex / AS3
http://blog.anaara.com/archives/198
#ファンと、もうこりごりという2つに分かれるflashpaperのflex版。
#pdfをswfに変換してFlash Playerで表示します。
DEVALDI ≫ FlexPaper
http://www.devaldi.com/?page_id=260
#purepdfのサンプルはこれを使っているようです。
衡山毛筆フォント
http://musashi.or.tv/kouzanmouhitufont.htm
■iText関連の記事など
purepdfはiTextの移植なのでiTextに関連する記事をみるとだいたい使い方がわかると思います。
[ヅラド] iText にて iTextAsianCmaps.jar と iTextAsian.jar を使った日本語フォント描画
http://www.nilab.info/zurazure2/000695.html
@IT:Java TIPS -- フリーのライブラリを使いPDFを生成する
http://www.atmarkit.co.jp/fjava/javatips/134java025.html
iTextを利用してJavaからPDF形式の帳票を出力する:CodeZine
http://codezine.jp/article/detail/84
iText Tutorial: Getting fonts
http://ujihara.jp/iTextdotNET/ja/tutorial/fonts/getting/index.html
#Fontの指定や埋め込みについては以下のwikiページをみるとわかります。
FontsHowTo - purepdf - How to work with fonts in purePDF - Project
Hosting on Google Code
http://code.google.com/p/purepdf/wiki/FontsHowTo
iTextベースとはいえ、CJKやバーコードも入っててすごいですね!
通りすがりのものです。
現バージョンではまだPdfStamperクラスがまだ実装されてないみたいですね。
PdfStamperが実装されれば、AlivePDFより使い勝手が良くなるんですけどねぇ。