2010
5/10

AlivePDFを使ってSWFからPDF出力

SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。

alivepdf – Project Hosting on Google Code

AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用(?)のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。

試しに組んでみたファイルのドキュメントクラスは以下の通り。

package  {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import org.alivepdf.colors.RGBColor;
	import org.alivepdf.display.Display;
	import org.alivepdf.fonts.CoreFont;
	import org.alivepdf.fonts.FontFamily;
	import org.alivepdf.fonts.Style;
	import org.alivepdf.images.ImageFormat;
	import org.alivepdf.layout.Layout;
	import org.alivepdf.layout.Orientation;
	import org.alivepdf.layout.Size;
	import org.alivepdf.layout.Unit;
	import org.alivepdf.pdf.PDF;
	import org.alivepdf.saving.Download;
	import org.alivepdf.saving.Method;
	import utils.Utils;

	/**
	 * ...
	 * @author bricoleur.inc / Tonpoo.com
	 */
	public final class AlivePDFSample extends MovieClip{

		public function AlivePDFSample() {
			this.stage.addEventListener(MouseEvent.MOUSE_DOWN, onClick, false, 0, true);
		}
		private function onClick(e:MouseEvent):void {
			//PDFインスタンスを生成
			var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);
			//PDFの表示モードを指定
			myPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);
			//PDFのページを追加
			myPDF.addPage();

			//文字色を設定
			myPDF.textStyle ( new RGBColor ( 0xFF0000 ) );
			//フォントサイズを指定
			myPDF.setFontSize ( 18 );
			//ページの位置(?)を指定
			myPDF.setXY( 10, 40 );
			//マルチセルの追加
			myPDF.addMultiCell ( 300, 1, "This is my PDF Headline" );

			//PDFの出力
			myPDF.save(Method.REMOTE, "http://www.tonpoo.com/_test/create.php", Download.ATTACHMENT, "sample.pdf");
		}
	}
}

PDFインスタンスを生成

//PDFインスタンスを生成
var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);

まずはnew演算子でPDFインスタンスを生成。引数には「印刷方向」「単位」「印刷サイズ」「印刷角度」を指定できます。何も指定しなくてもいいようですが、サンプルでは「印刷角度」以外を指定してます。

印刷方向
  • Orientation.LANDSCAPE:横向き
  • Orientation.PORTRAIT:縦向き
単位
  • Unit.CM:センチメートル
  • Unit.INCHES:インチ
  • Unit.MM:ミリメートル
  • Unit.POINT:ポイント
印刷サイズ
  • Size.A3:A3
  • Size.A4:A4
  • Size.A5:A5
  • Size.LEGAL:リーガル
  • Size.LETTER:レター
  • Size.TABLOID:タブロイド

「印刷サイズ」でA4やA5の他にレターやリーガルがあるあたりは欧米の紙サイズが基準になってるためですね。B4やB5など上記に無いサイズを指定する場合は・・・どうしたらいいんでしょ。

PDFの表示モードを指定

//PDFの表示モードを指定
myPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);

次に出力したPDFファイルを開いたときの表示モードをPDF.setDisplayModeで指定。引数には「ズーム」「レイアウト」「モード」「拡大率」を指定できます(サンプルでは「ズーム」と「レイアウト」のみ指定)。

ズーム
  • Display.DEFAULT:デフォルト
  • Display.FULL_PAGE:ページ全体を表示
  • Display.FULL_WIDTH:ページ幅を基準に表示
  • Display.REAL:よくわからない。100%表示ってこと?
レイアウト
Layout.SINGLE_PAGEが「単一ページ」のことだろうと思うんですが、他の値(Layout.ONE_COLUMN / Layout.TWO_COLUMN_LEFT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_PAGE_LEFT)については試してないのでよく分かりません。おそらく複数ページ同時表示とかだと思うんですが・・・。
拡大率
数値で拡大率を指定できるようです。

PDFのページを追加

//PDFのページを追加
myPDF.addPage();

次に、PDF.addPage()メソッドを使ってページを追加します。単純にこのaddPageメソッドを例えば10回繰り返すと、空のページ10ページで構成されるPDFファイルができます。

テキストの追加

//文字色を設定
myPDF.textStyle ( new RGBColor ( 0xFF0000 ) );
//フォントサイズを指定
myPDF.setFontSize ( 18 );
//ページの位置(?)を指定
myPDF.setXY( 10, 40 );
//マルチセルの追加
myPDF.addMultiCell ( 300, 1, "This is my PDF Headline" );

まずはPDF.textStyleメソッドで文字色を指定。引数には色指定の他にも下記のオプションが指定できますが、今回は割愛。

文字色
colors.IColorクラスというのがあって、そのクラスオブジェクトを指定するようです。とりあえずサンプルに従ってcolors.RGBColorインスタンスを指定してみました。
透過率
0~1の数値(Number)で文字の透過率を指定できます。
レンダリングモード
整数値(int)を指定する事でテキストレンダリングモードを指定できるそうですが、なんのことやら・・・。
単語間スペース
数値(Number)で単語間のスペースの値を指定できます。
文字間スペース
数値(Number)で文字間のスペースの値を指定できます。
スケール
数値(Number)で、Text scalingが指定できます。Text scalingって何でしょう・・・
行間
数値(Number)で行間を指定できます。

次にPDF.setFontSizeメソッドでフォントサイズを設定します。引数には整数値(int)が入ります。

次にPDF.setXYメソッドでページ内のX,Y位置を指定します。これって、要はこの後に配置するマルチセルの配置位置、って認識でいいんですかね・・・。

でもってその後にPDF.addMultiCellメソッドでテキストを含むセルを配置します。まだよくわかってないんですが、どうやらこの「セル」というのがPDFのページ内にいろいろ配置する単位のような感じなんですかね。引数には「幅」「高さ」「テキスト」「ボーダー」「横揃え」「塗り(?)」を指定できるようです。

PDFの出力

//PDFの出力
myPDF.save(Method.REMOTE, "http://www.tonpoo.com/xxxxxxxxx/create.php", Download.ATTACHMENT, "sample.pdf");

最後に、PDF.saveメソッドを使って内容を出力します。引数に指定できるのは「データ送信形式」「送信先URL」「ダウンロード形式」「ファイル名」「表示フレーム名」です。

データ送信形式
サーバー側にデータを送信してPDFを生成する場合はMethod.REMOTE、AIRを使った場合などでローカル側のみでPDFを生成する場合はMethod.LOCALを指定するようです。
送信先URL
Method.REMOTEの場合に、送信先のphpファイルのURLをここで指定します。
ダウンロード形式
PDFをブラウザ内で表示する場合はDownload.INLINE、保存ダイアログを出して保存させる場合はDownload.ATTACHMENTを指定します。
ファイル名
pdfファイルのファイル名を指定します。
表示フレーム名
フレーム内で展開されているコンテンツの場合に、PDFを開く先のフレーム名を指定する、ようです。

ちなみにサーバー側に設置するphp(create.php)のサンプルファイルは、前バージョンのAlivePDFのソースコード一式の中に入っていたものを流用しました。

<?php

$method = $_GET['method'];
$name = $_GET['name'];

if ( isset ( $GLOBALS["HTTP_RAW_POST_DATA"] )) {

	// get bytearray
	$pdf = $GLOBALS["HTTP_RAW_POST_DATA"];

	// add headers for download dialog-box
	header('Content-Type: application/pdf');
	header('Content-Length: '.strlen($pdf));
	header('Content-disposition:'.$method.'; filename="'.$name.'"');
	echo $pdf;

}  else echo 'An error occured.';

?>

とりあえず実際にアップして確認した所、PDFファイルが生成されてダウンロードできることを確認できました。次は任意のMovieClipの内容などをそのまま出力する方法とかですね。


Filed under: ActionScript3,alivepdfComments (0)— tonpoo @ 6:48 PM

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする