FlashからPDF生成可能なライブラリAlivePDFで写真のページものを作る

先んじて実験したいことがありまして、FlashからPDF生成可能なライブラリAlivePDFを使って写真のページものを作ります。

AlivePDFとは、Flashからクライアント側でPDF生成可能なライブラリです。ライセンスはMITライセンスです。

それではインストールから。

インストール

ダウンロード

ファイルのダウンロードはこちら。

alivepdf – Open-source AS3 PDF library – Google Project Hosting

こちらから、Downloads>AlivePDF 0.1.5 RC.zipをダウンロードします。

SWCファイルの取り出し

AlivePDF 0.1.5 RC.zipが特別なのかもしれませんがzipを解凍してみると.svnやらflexのプロジェクトやらが混じっていて、ちょっと戸惑います。

実際のソースは、

  • Sources/src以下 → .asでのソースファイル一式
  • Sources/bin/AlivePDF.swc → swcファイル

にあるので、今回はAlivePDF.swcのほうを使います。
Sources/src以下のは、.svnフォルダが混ざっているため色々と使い勝手が微妙なので使用しません。

AlivePDF.swcを割り当て

まず、AlivePDF.swcを割り当てます。

ライブラリの中身

ライブラリの中身は以下のとおりです。

ライブラリの重要なパーツは1ページのひな形を司るPageTemplateと、実際の5枚の写真(JPEG)photo1~5です。
PDFを作る際はページごとにPageTemplateを呼び出しphoto[n]をPageTemplate内に配置します。加えて、ページ数設定設定や写真配置後画面に収まるようリサイズを行います。

実際のコード

コードはこのように書きました。

package  
{
	import fl.controls.Button;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.net.FileReference;
	import org.alivepdf.display.Display;
	import org.alivepdf.layout.Layout;
	import org.alivepdf.layout.Orientation;
	import org.alivepdf.layout.Size;
	import org.alivepdf.layout.Unit;
	import org.alivepdf.pages.Page;
	import org.alivepdf.saving.Method;
	
	/**
	 * alivepdf_paged
	 * @author seigo
	 */
	public class Main extends MovieClip 
	{
		import org.alivepdf.pdf.PDF;
		
		public var pages:MovieClip;
		
		public var BtnPagedPrint:Button;
		
		public function Main() 
		{
			BtnPagedPrint.addEventListener( MouseEvent.CLICK , handlerSavePDF );
		}
		
		public function handlerSavePDF ( e:MouseEvent ):void
		{
			// インスタンスを生成 ページはA4で横 単位はMM指定
			var pagedPDF:PDF = new PDF(Orientation.LANDSCAPE, Unit.MM, Size.A4);
			
			// 表示設定 全画面表示
			pagedPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);
			
			// _________________________________________________ ページ生成
			
			var bmp:Bitmap;
			var page:PageTemplate;
			
			// PDFのページを追加 1ページ目
			pagedPDF.addPage();  // ページを作り始めるよという宣言
			page = new PageTemplate;  // ページテンプレートをリンケージから読み込む
			bmp = new Bitmap;
			bmp.bitmapData = new photo1;  // リンケージからphoto1を呼び出し
			page.photo.addChild( bmp );
			page.photo.scaleX = page.photo.scaleY = 0.5;  // 1024x768の画像を640x480にリサイズ(50%)
			page.txtInfo.text = "- 1 -";  // ページ数設定
			pagedPDF.addImage( page );
			
			// PDFのページを追加 2ページ目
			pagedPDF.addPage(); 
			page = new PageTemplate;
			bmp = new Bitmap;
			bmp.bitmapData = new photo2;  // リンケージからphoto2を呼び出し
			page.photo.addChild( bmp );
			page.photo.scaleX = page.photo.scaleY = 0.5;
			page.txtInfo.text = "- 2 -";
			pagedPDF.addImage( page );
			
			// PDFのページを追加 3ページ目
			pagedPDF.addPage(); 
			page = new PageTemplate;
			bmp = new Bitmap;
			bmp.bitmapData = new photo3;  // リンケージからphoto3を呼び出し
			page.photo.addChild( bmp );
			page.photo.scaleX = page.photo.scaleY = 0.5;
			page.txtInfo.text = "- 3 -";
			pagedPDF.addImage( page );
			
			// PDFのページを追加 4ページ目
			pagedPDF.addPage(); 
			page = new PageTemplate;
			bmp = new Bitmap;
			bmp.bitmapData = new photo4;  // リンケージからphoto4を呼び出し
			page.photo.addChild( bmp );
			page.photo.scaleX = page.photo.scaleY = 0.5;
			page.txtInfo.text = "- 4 -";
			pagedPDF.addImage( page );
			
			// PDFのページを追加 4ページ目
			pagedPDF.addPage(); 
			page = new PageTemplate;
			bmp = new Bitmap;
			bmp.bitmapData = new photo5;  // リンケージからphoto5を呼び出し
			page.photo.addChild( bmp );
			page.photo.scaleX = page.photo.scaleY = 0.5;
			page.txtInfo.text = "- 5 -";
			pagedPDF.addImage( page );
			
			// _________________________________________________ save FileReference
			
			// ページ保存 FLASH単体で保存できる
			var fr:FileReference = new FileReference();
			fr.save ( pagedPDF.save ( Method.LOCAL ), "alivepdf_paged.pdf" );
			
		}
	}

}

長くなってしまいましたが、ページ作成は以下が肝です。

// PDFのページを追加 1ページ目
pagedPDF.addPage();  // ページを作り始めるよという宣言
page = new PageTemplate;  // ページテンプレートをリンケージから読み込む
bmp = new Bitmap;
bmp.bitmapData = new photo1;  // リンケージからphoto1を呼び出し
page.photo.addChild( bmp );
page.photo.scaleX = page.photo.scaleY = 0.5;  // 1024x768の画像を640x480にリサイズ(50%)
page.txtInfo.text = "- 1 -";  // ページ数設定
pagedPDF.addImage( page );

基本レイアウトを配置したページテンプレートをリンケージから読み込み、写真とページ数を割り当てています。
また、今回は200%のサイズ画像を50%に縮めることで実寸100%において解像度を高めるようにしています。

これが5ページ分続きます。

FlashPlayer10であればFlash単体で保存できる

上記のコードでFLASH単体で保存できるコードが書かれていますが、これは本家のサイトで紹介されていたやり方です。

AlivePDF – AlivePDF with FileReference in Astro

// ページ保存 FLASH単体で保存できる
var fr:FileReference = new FileReference();
fr.save ( pagedPDF.save ( Method.LOCAL ), "alivepdf_paged.pdf" );

これは、FlashPlayer10から導入されたFileReference.saveを利用したやり方なので、FlashPlayer9で利用する場合は、従来からあるPHPを利用した保存を利用します。

実際に動くFLASH

This movie requires Flash Player 9

FlashPlayer10であればPDFを見ることが出来ますが、9だと見れないので、出来上がったPDFも置いておきます。

alivepdf_paged.pdf

サンプルファイル

サンプルファイルも置いておきます。 →サンプルファイルダウンロード
※zip内にはAlivePDF.swcはありませんのでご注意ください。別途自分でダウンロードいただいて割り当てましょう。

おわりに

いかがでしたでしょうか。

今回は写真をページもののPDFにしたい用途だったのでaddPageとaddImageでシンプルにコードを組むことが出来ました。
負荷も大きめのJPEGを5枚でもそれほど重く感じなかったので実用に叶うものですね。

それでは良き Flash Life を!

参考記事

AlivePDF – ActionScript 3 Open-Source PDF Library – 100% client side PDF generation which makes you and your server happy 😉

FlashからPDFを生成(AlivePDF) | 水玉製作所

TONPOOBLOG » AlivePDFを使ってSWFからPDF出力