先日、案件でFlashからの印刷を扱うことがあったので、そのとき調べたいろいろをまとめてみました。

 

基本

as3での印刷にはPrintJobクラスを使用します。

簡単3stepです。

1.printJob.start() → プリントダイアログの表示
2.printJob.addPage(sprite) → 印刷対象の設定 × ページ分
3.printJob.send() → データをプリンタに送信

実際に使うときは

var printJob:PrintJob = new PrintJob();
if(printJob.start()) //←印刷ダイアログでOKが押されるとtrue
{                
  try {
    printJob.addPage(pageSprite1);
  }
  catch(e:Error){} //←エラーの場合は何もしない
  printJob.send();
}

という感じです。


 

印刷対象の設定

as3での印刷はSprite単位になります。
addPage(mySprite);という形で印刷ページを追加していく感じなので
複数ページにわたる印刷も簡単に設定できます。

このとき、印刷対象のSpriteはstageにaddChildされていないといけません。
visibleをfalseに設定すると、印刷されないため、印刷対象をユーザーに
見せたくない場合には表示領域外などに配置
しておくのがいいと思います。

対象となるSprite自体に適用している変形はそのまま反映されてしまいます。

Sprite単位で印刷対象となるため、複数Spriteが重なって配置されていても
問題ありません。

 
 

印刷する大きさについて

PrintJobクラスは、OSの印刷ダイアログで設定した用紙のサイズや
印刷可能領域のサイズをピクセル単位で取得できます。

300dpiのプリンタでA4縦であれば用紙サイズは2480×3508pxくらいですね。

as3print.gif


pageWidth,pageHeight で印刷可能領域
paperWidth,paperHeight で用紙全体の大きさを取得。

その大きさに合わせて、印刷対象のSpriteを拡大縮小することで
用紙サイズに合わせた印刷が可能です。

pageSprite.width = printJob.pageWidth;
pageSprite.height = printJob.pageHeight;
pageSprite.scaleX = pageSprite.scaleY = Math.min(pageSprite.scaleX, pageSprite.scaleY);

こんな感じでしょうか。

orientation プロパティで用紙の向きを取得できるので
横の場合はSpriteを90度回転させるとより素敵ですね。

ちなみにSpriteの外の部分は、Flashドキュメントに設定した背景色で塗りつぶされます


MACのFlashPlayre10.0でpageWidth,pageHeightが正しく取れないバグがあり
pageWidth,pageHeight がそれぞれ、paperWidth,paperHeighと同じ値になってしまいます。
FlashPlayer10.1で解決されているようですが、MACのFP10.0の場合は
こちらで余白の大きさを予測して、その分印刷対象を小さくしてあげると良いかと思います。
一般的なプリンタだと7~8%程度の余白をつけてあげると良い感じです。


その他

ベクターとしての印刷とビットマップとしての印刷が選べます。
ベクターとして印刷した場合、文字やシェイプはぺクターデータとして出力されます。

ただ、ベクターでの印刷の場合は、透明度やカラー効果が無視されます。
アルファチャンネルを含んだPNG画像なんかもマット白の透過しない画像に変換されます。

アルファ情報やカラー効果を印刷に反映する場合は、PrintJobOptionsクラスを利用して
printAsBitmapプロパティをtrueにしたオプションをaddPageの引数に加えてあげることで
アルファやカラー効果を印刷に反映させることが出来ます。


 

HTML5飯