flash.events:EventDispatcher
PrintJob クラスを使用すると、コンテンツを作成して 1 ページまたは複数のページに印刷できます。このクラスを使用すると、可視コンテンツをダイナミックにレンダリングまたは画面外でレンダリングし、1 つの印刷ダイアログボックスを使用して、コンテンツの縦横比を保持しつつ拡大縮小せずにドキュメントを印刷できます。この機能は、データベースコンテンツやダイナミックテキストなどのダイナミックコンテンツをレンダリングおよび印刷するときに特に便利です。
モバイルブラウザーのサポート:このクラスはモバイルブラウザーではサポートされません。
AIR プロファイルのサポート:この機能はすべてのデスクトップオペレーティングシステムでサポートされますが、モバイルデバイスまたはテレビ用 AIR デバイスではサポートされません。PrintJob.isSupported プロパティを使用して、サポートされているかどうかを実行時にテストすることができます。複数のプロファイル間での API サポートについて詳しくは、AIR プロファイルのサポートを参照してください。
印刷ジョブを作成するには、PrintJob() コンストラクターを使用します。
さらに、PrintJob クラスのプロパティを使用すると、ユーザーのプリンター設定(用紙の高さ、幅、イメージの向きなど)にアクセスすることができ、プリンターの設定に合わせて Flash のコンテンツを動的にフォーマットするようにドキュメントを設定することができます。
注意:ActionScript 3.0 では、ActionScript の以前のバージョンと同様に、PrintJob オブジェクトが単一フレームに制限されません。ただし、印刷ダイアログボックスで「OK」ボタンをクリックすると印刷ステータス情報が表示されるため、ページをスプーラに送信したら直ちに PrintJob.addPage() および PrintJob.send() を呼び出す必要があります。PrintJob.send() 呼び出しの格納されたフレームに遅延が到達すると、印刷処理が遅延します。
また、次の間隔には、15 秒のスクリプトのタイムアウト制限が適用されます。
- PrintJob.start() および 1 つ目の PrintJob.addPage()
- PrintJob.addPage() および 2 つ目の PrintJob.addPage()
- 最後の PrintJob.addPage() および PrintJob.send()
上記の間隔のいずれかが 15 秒以上である場合、次に PrintJob インスタンスの PrintJob.start() を呼び出したときに false が返されます。また、次に PrintJob インスタンスの PrintJob.addPage() を呼び出したときに、Flash Player または Adobe AIR からランタイム例外がスローされます。
次の例では、印刷の基本を示します。新しい PrintJob が作成され、正常に開始された後は、addPage() メソッドによってスプライトが単一のページとして追加されます。send() メソッドによって、プリンターにページがスプールされます。
package
{
import flash.printing.PrintJob;
import flash.display.Sprite;
public class BasicPrintExample extends Sprite
{
var myPrintJob:PrintJob = new PrintJob();
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawCircle(100, 100, 50);
public function BasicPrintExample()
{
if (myPrintJob.start()) {
try {
myPrintJob.addPage(mySprite);
}
catch(e:Error) {
// handle error
}
myPrintJob.send();
}
}
}
次の例では、クラス PrintJobExample を使用して小さな文書を作成し、その文書をプリンターに送ります。ここでは以下の手順を実行します。
- sheet1 および sheet2 という名前の Sprite 型の 2 つの変数を宣言します。
- init() を呼び出します。これは、新しい Sprite インスタンスを sheet1 と sheet2 に割り当てた後、別の引数を使用して createSheet() を呼び出します。
- createSheet() は、以下の処理を行います。
- 渡された Sprite オブジェクトを使用して矩形を描画します。これは、明るい灰色の背景に 1 ピクセルの黒い境界線を使用し、x = 0、y = 0 の位置に幅 100 ピクセル、高さ 200 ピクセルで描画されます。
- 新しい TextField オブジェクトが作成されます。この名前は txt であり、Sprite と同じサイズです。wordWrap プロパティは true に設定され、テキストプロパティは createSheet() への引数として渡される String に設定されます。
- 渡された Object 引数が null ではない場合、新しい Sprite インスタンスを作成します。このインスタンスの名前は img であり、渡されたオブジェクトの座標およびサイズのプロパティを使用して、白い矩形を描画するときに使用されます。addChild() を使用して、白い四角形を Sprite オブジェクトの表示リストに追加します。
- addChild() を使用して、txt TextField を Sprite オブジェクトの表示リストに追加します。
- コンストラクターに戻ると、有効な(コメントアウトされていない)印刷メソッドが呼び出されます。これらのメソッドは非常に似ているため、printOnePerPage() については後で説明します。
- printOnePerPage() は、以下の処理を行います。
- 新しい PrintJob オブジェクトを宣言します。オブジェクトには uint 型として pj と pagesToPrint という名前を付けます。
- オペレーティングシステムのネイティブの印刷ダイアログボックスを開き、ユーザーが OK をクリックするまで待機します。
- 原点を確認し、「横」が選択されている場合は、エラーをスローして終了します。
- sheet1 と sheet2 にページの高さと幅を設定します。
- sheet1 および sheet2 を印刷スプーラに送ります(addPage() を使用)。
- 印刷するページ数が 1 ページ以上ある場合は、スプールされたページをすべて印刷します。
- draw() メソッドが呼び出されます。このメソッドによりステージに合わせて 2 つの Sprite プロパティのサイズが変更され、sheet2 が sheet1 の右側になるように再配置されます。
メモ:コンストラクターは、必要に応じて、ページあたり 1 シート、ページあたり 2 シート、またはページの上半分に印刷の 3 つの印刷メソッドのいずれかを選択できるように設定されます。コードコメントを使用して印刷メソッドのうちちょうど 2 つが無効にされている場合に限り、この例は適切に動作します。この例は、printOnePerPage() が呼び出されるように設定されています。
package {
import flash.printing.PrintJob;
import flash.printing.PrintJobOrientation;
import flash.display.Stage;
import flash.display.Sprite;
import flash.text.TextField;
import flash.geom.Rectangle;
public class PrintJobExample extends Sprite {
private var sheet1:Sprite;
private var sheet2:Sprite;
public function PrintJobExample() {
init();
printOnePerPage();
// printTwoPerPage();
// printTopHalf();
draw();
}
private function init():void {
sheet1 = new Sprite();
createSheet(sheet1, "Once upon a time...", {x:10, y:50, width:80, height:130});
sheet2 = new Sprite();
createSheet(sheet2, "There was a great story to tell, and it ended quickly.\n\nThe end.", null);
}
private function createSheet(sheet:Sprite, str:String, imgValue:Object):void {
sheet.graphics.beginFill(0xEEEEEE);
sheet.graphics.lineStyle(1, 0x000000);
sheet.graphics.drawRect(0, 0, 100, 200);
sheet.graphics.endFill();
var txt:TextField = new TextField();
txt.height = 200;
txt.width = 100;
txt.wordWrap = true;
txt.text = str;
if(imgValue != null) {
var img:Sprite = new Sprite();
img.graphics.beginFill(0xFFFFFF);
img.graphics.drawRect(imgValue.x, imgValue.y, imgValue.width, imgValue.height);
img.graphics.endFill();
sheet.addChild(img);
}
sheet.addChild(txt);
}
private function printOnePerPage():void {
var pj:PrintJob = new PrintJob();
var pagesToPrint:uint = 0;
if(pj.start()) {
if(pj.orientation == PrintJobOrientation.LANDSCAPE) {
throw new Error("Without embedding fonts you must print one sheet per page with an orientation of portrait.");
}
sheet1.height = pj.pageHeight;
sheet1.width = pj.pageWidth;
sheet2.height = pj.pageHeight;
sheet2.width = pj.pageWidth;
try {
pj.addPage(sheet1);
pagesToPrint++;
}
catch(e:Error) {
// do nothing
}
try {
pj.addPage(sheet2);
pagesToPrint++;
}
catch(e:Error) {
// do nothing
}
if(pagesToPrint > 0) {
pj.send();
}
}
}
private function printTwoPerPage():void {
var pj:PrintJob = new PrintJob();
var pagesToPrint:uint = 0;
if(pj.start()) {
if(pj.orientation == PrintJobOrientation.PORTRAIT) {
throw new Error("Without embedding fonts you must print two sheets per page with an orientation of landscape.");
}
sheet1.height = pj.pageHeight;
sheet1.width = pj.pageWidth/2;
sheet2.height = pj.pageHeight;
sheet2.width = pj.pageWidth/2;
var sheets:Sprite = new Sprite();
sheets.addChild(sheet1);
sheets.addChild(sheet2);
sheets.getChildAt(1).x = sheets.getChildAt(0).width;
try {
pj.addPage(sheets);
pagesToPrint++;
}
catch(e:Error) {
// do nothing
}
if(pagesToPrint > 0) {
pj.send();
}
}
}
private function printTopHalf():void {
var pj:PrintJob = new PrintJob();
var pagesToPrint:uint = 0;
if(pj.start()) {
if(pj.orientation == PrintJobOrientation.PORTRAIT) {
throw new Error("Without embedding fonts you must print the top half with an orientation of landscape.");
}
sheet1.height = pj.pageHeight;
sheet1.width = pj.pageWidth/2;
sheet2.height = pj.pageHeight;
sheet2.width = pj.pageWidth/2;
var sheets:Sprite = new Sprite();
sheets.addChild(sheet1);
sheets.addChild(sheet2);
sheets.getChildAt(1).x = sheets.getChildAt(0).width;
try {
pj.addPage(sheets, new Rectangle(0, 0, sheets.width, sheets.height/2));
pagesToPrint++;
}
catch(e:Error) {
// do nothing
}
if(pagesToPrint > 0) {
pj.send();
}
}
}
private function draw():void {
var sheetWidth:Number = this.stage.stageWidth/2;
var sheetHeight:Number = this.stage.stageHeight;
addChild(sheet1);
sheet1.width = sheetWidth;
sheet1.height = sheetHeight;
addChild(sheet2);
sheet2.width = sheetWidth;
sheet2.height = sheetHeight;
sheet2.x = sheet1.width;
}
}
}
次の例では、印刷の追加機能について説明します。この例では、PrintJob 設定の印刷部数、用紙サイズ(Legal)およびページの向き(横)を初期化します。最初にページ設定ダイアログを表示してから、印刷ダイアログを表示して印刷ジョブを開始します。
package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.geom.Rectangle;
import flash.printing.PaperSize;
import flash.printing.PrintJob;
import flash.printing.PrintJobOrientation;
import flash.printing.PrintUIOptions;
import flash.text.TextField;
public class PrintJobExample extends Sprite
{
private var bg:Sprite;
private var txt:TextField;
private var pj:PrintJob;
private var uiOpt:PrintUIOptions;
public function PrintJobExample():void
{
var pj = new PrintJob();
uiOpt = new PrintUIOptions();
initPrintJob();
initContent();
draw();
printPage();
}
private function printPage():void
{
if (pj.supportsPageSetupDialog)
{
pj.showPageSetupDialog();
}
if (pj.start2(uiOpt, true))
{
try
{
pj.addPage(this, new Rectangle(0, 0, 100, 100));
}
catch (error:Error)
{
// Do nothing.
}
pj.send();
}
else
{
txt.text = "Print job terminated";
pj.terminate();
}
}
private function initContent():void
{
bg = new Sprite();
bg.graphics.beginFill(0x00FF00);
bg.graphics.drawRect(0, 0, 100, 200);
bg.graphics.endFill();
txt = new TextField();
txt.border = true;
txt.text = "Hello World";
}
private function initPrintJob():void
{
pj.setPaperSize(PaperSize.LEGAL);
pj.orientation = PrintJobOrientation.LANDSCAPE;
pj.copies = 2;
pj.jobName = "Flash test print";
}
private function draw():void
{
addChild(bg);
addChild(txt);
txt.x = 50;
txt.y = 50;
}
}
}