kano

AlivePDFでPDFにフォントを埋め込んでみる

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では日本語フォントを埋め込むことは出来ませんでしたが、英語を使用するときなどには便利かもしれません。

AlivePDF – ActionScript 3 Open-Source PDF Library

新しいウェブ体験を作ろう TAMのPWA開発
お問い合わせはこちら