FlashからPDFを作成するライブラリに、AlivePDFというものがあります。
古い話になりますが、2010年2月に更新されたver.0.1.5[RC]から、フォントの埋め込みが可能になりました。
というわけで、試してみました。
AlivePDFは以下からダウンロードできます。
http://code.google.com/p/alivepdf/downloads/list
ダウンロードしたファイル内の、Sources/bin/内にswcファイルが、Sources/src/内にasファイル一式があります。
どちらかにパスを通して使用します。
次に適当なフォントファイルを用意します。
ttf (TrueType)フォントにしか対応していないようです。
さらに、afmファイルを用意します。
afmファイルとは、Adobe Font Metricsの略で、Adobeが独自に規格したフォントファイルのようです。(→wikipedia)
この形式には、ttfファイルがあれば変換する事が出来ます。
色々と変換サービスがあるようですが、今回は以下を使用しました。
フォントファイルのフォーマットを変換する: ttf otf fon pfb dfont afm
これらのファイルをflash内でembedして使用します。
※embedはCS4以降で使用可能です。
Flashのタイムラインに直接書く場合は、以下のようになります。
[Embed( source="REZ.ttf", mimeType="application/octet-stream" )] var fontStream: Class;
[Embed( source="REZ.afm", mimeType="application/octet-stream" )] var afmStream: Class;
この際、sourceのパスはflaファイルから見た階層になります。
(外部asファイルでembedする場合はasファイルから見た階層となります)
(パブリッシュ時に、flexのライブラリが必要です、といったダイアログが表示されますので、ライブラリパスを更新しておきます)
これでembedされたファイルが、その直後に書いたクラスにインポートされ、使用可能となります。
そして、それらをAlivePDFで使用するには、以下のようにEmbeddedFontで指定します。
var font: EmbeddedFont = new EmbeddedFont(new fontStream(), new afmStream(), CodePage.CP1252);
第一引数にttfファイル、第二引数にafmファイル、そして第三引数でCodePageクラスを指定します。
このCodePageというのは、文字コードから実際の文字を導き出すためのマップ、だそうです。
ダウンロードしたAlivePDFのデータ内の、Sources/src/org/alivepdf/fonts/map/ 以下に実際のmapファイルが格納されています。
デフォルトでは、CP1252、となっていましたので、今回もそちらを指定しています。
以下に動作するサンプルを載せておきます。ステージ内をクリックするとダイアログが表示され、保存できます。
(フォントファイルは各自ご用意下さい)
※要FP10以上
import org.alivepdf.display.*; import org.alivepdf.fonts.*; import org.alivepdf.layout.*; import org.alivepdf.pdf.*; import org.alivepdf.saving.*; [Embed( source="xxx.ttf", mimeType="application/octet-stream" )] var fontStream: Class; [Embed( source="xxx.afm", mimeType="application/octet-stream" )] var afmStream: Class; stage.addEventListener(MouseEvent.CLICK, start); function start(e:MouseEvent):void { var font: EmbeddedFont = new EmbeddedFont(new fontStream(), new afmStream(), CodePage.CP1252); var cPdf:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4); cPdf.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE); cPdf.addPage(); cPdf.setFont(font, 24); cPdf.addText("This is test page!", 20, 20); var pdfBytes:ByteArray = cPdf.save(Method.LOCAL); var f:FileReference = new FileReference(); f.save(pdfBytes, "test.pdf"); f.addEventListener(Event.COMPLETE, saveComplete); } function saveComplete(e:Event):void { //保存完了 }
同じ要領で日本語のフォントを読み込ませてみましたが、CodePageが対応していないため、何も表示されませんでした。
日本語のフォントを埋め込みたい場合は、purePDFというライブラリを使えば埋め込むことが出来ます。
こちらのサイトが詳しいです。
ActionScript 3.0で日本語対応のPDFが作成できる「purePDF」のサンプル | ClockMaker Blog
AlivePDFでは日本語フォントを埋め込むことは出来ませんでしたが、英語を使用するときなどには便利かもしれません。