제 24 장 인쇄 24 Adobe Flash Player 9는운영체제의인쇄인터페이스와통신할수있으므로페이지를인쇄스풀러로전달할수있습니다. Flash Player에서스풀러에전송하는각페이지에는데이터베이스값및동적텍스트등사용자에게보이거나, 동적이거나, 스크린밖에표시되는내용이포함될수있습니다. 또한 Flash Player는사용자의프린터설정에따라 flash.printing.printjob 클래스의속성을설정하므로그에맞게페이지형식을지정할수있습니다. 이장에서는 flash.printing.printjob 클래스메서드와속성을사용하여인쇄작업을만들고, 사용자의인쇄설정을읽고, Flash Player 및사용자운영체제의피드백에따라인쇄작업을조정하는전략에대해설명합니다. 목차 인쇄의기초........................................... 670 페이지인쇄............................................ 671 Flash Player 작업및시스템인쇄......................... 672 크기, 배율및방향설정.................................. 675 예제 : 여러페이지인쇄...................................677 예제 : 배율조절, 자르기및자동맞춤....................... 679 669
인쇄의기초 인쇄작업소개 ActionScript 3.0에서는 PrintJob 클래스를사용하여표시내용의스냅샷을만들고출력에잉크용지품질의표현으로변환합니다. 인쇄내용설정은여러요소를배치하고크기를조정하며원하는레이아웃을만드는등몇가지면에서화면표시를설정하는것과동일합니다. 하지만인쇄가화면레이아웃과구별되는몇가지특성이있습니다. 예를들어, 프린터와컴퓨터모니터에서사용되는해상도가다르고, 컴퓨터화면내용은동적이고변화가능한반면인쇄내용은본질적으로정적이며, 인쇄계획시에는페이지크기가고정되어있다는제약및여러페이지인쇄기능을고려해야합니다. 이러한차이는명백해보이기는하지만 ActionScript에서인쇄설정시반드시유념해야합니다. 정확한인쇄를위해서는사용자가지정하는값과사용자프린터의특성이적절하게조합되어야하므로 PrintJob 클래스에는고려해야할프린터의중요특성을결정할수있는속성이포함됩니다. 일반적인인쇄작업 이장에서는다음과같은일반적인인쇄작업에대해설명합니다. 인쇄작업시작 인쇄작업에페이지추가 사용자의인쇄작업취소여부결정 비트맵또는벡터렌더링사용여부지정 페이지크기, 배율및방향설정 인쇄가능영역지정 화면크기를페이지크기로변환 여러페이지인쇄작업수행 중요한개념및용어 다음은이장에서사용된주요용어참조목록입니다. 스풀러 : 인쇄대기중인페이지를추적하여프린터가사용가능할때프린터로작업을전송하는프린터드라이버소프트웨어또는운영체제의일부입니다. 페이지방향설정 : 인쇄할내용을용지의가로또는세로방향으로회전하는것입니다. 인쇄작업 : 1회의출력을구성하는페이지또는페이지집합입니다. 670 인쇄
이장의예제를사용하여작업 장의내용을따라작업하면서예제코드샘플을직접테스트할수있습니다. 이장의코드샘플중상당수는전체인쇄작업예제또는값확인용코드가아니라코드의일부입니다. 예제를테스트하려면인쇄할요소를만들고코드샘플에이러한요소를사용합니다. 마지막두장에는인쇄작업을수행할뿐만아니라인쇄할내용을정의하는코드가포함된전체인쇄예제가나와있습니다. 예제코드샘플을테스트하려면 : 1. 새 Flash 문서를만듭니다. 2. 타임라인의프레임 1에서키프레임을선택하고 [ 액션 ] 패널을엽니다. 3. [ 스크립트 ] 창에코드샘플을복사합니다. 4. 주메뉴에서 [ 컨트롤 ] > [ 무비테스트 ] 를선택하여 SWF 파일을만들고예제를테스트합니다. 페이지인쇄 인쇄작업을처리하려면 PrintJob 클래스의인스턴스를사용합니다. Flash Player를통해기본페이지를인쇄하려면다음 4개의명령문을차례로사용하십시오. new PrintJob(): 지정한이름의새로운인쇄작업인스턴스를만듭니다. PrintJob.start(): 운영체제의인쇄프로세스를초기화하여사용자에게 [ 인쇄 ] 대화상자를호출하고인쇄작업의읽기전용속성이선택되도록합니다. PrintJob.addPage(): Sprite 객체및그안에포함된자식, 인쇄영역의크기, 프린터에서이미지를벡터로인쇄할지또는비트맵으로인쇄할지여부등인쇄작업내용에대한정보가들어있습니다. addpage() 에대해연속호출을사용하여여러페이지에걸쳐여러스프라이트를인쇄할수있습니다. PrintJob.send(): 페이지를운영체제의프린터로전송합니다. 그러므로예를들면매우간단한인쇄작업스크립트가다음과같이보일수있습니다 ( 컴파일을위한 package, import 및 class 문포함 ). package import flash.printing.printjob; import flash.display.sprite; public class BasicPrintExample extends Sprite var myprintjob:printjob = new PrintJob(); var mysprite:sprite = new Sprite(); public function BasicPrintExample() 페이지인쇄 671
myprintjob.start(); myprintjob.addpage(mysprite); myprintjob.send(); 중요 이예는인쇄작업스크립트의기본요소를보여주기위한것으로오류처리는포함되어있지않습니다. 인쇄작업을취소하는사용자에게적절히응답하는스크립트를작성하려면 672 페이지의 예외및반환처리 를참조하십시오. 특정이유로인해 PrintJob 객체의속성을제거할필요가있다면 PrintJob 변수를 null 로설정하십시오 ( 예 : myprintjob = null). Flash Player 작업및시스템인쇄 Flash Player 에서는운영체제의인쇄인터페이스에페이지를전달하므로 Flash Player 에서관리하는작업의범위와운영체제의자체인쇄인터페이스에서관리하는작업의범위를알아야합니다. Flash Player 는인쇄작업을초기화하고, 프린터의페이지설정일부를읽고, 인쇄작업의내용을운영체제에전달하고, 사용자나시스템에서인쇄작업을취소했는지여부를확인합니다. 프린터별대화상자를표시하거나, 스풀링된인쇄작업을취소하거나, 프린터의상태를보고하는등그밖의프로세스는모두운영체제에서처리됩니다. Flash Player 에서는인쇄작업을초기화하거나형식을지정하는데문제가있는경우에응답은할수있지만운영체제의인쇄인터페이스에서특정속성이나조건에대해서만다시보고할수있습니다. 개발자의경우코드에이러한속성이나조건에응답할수있는기능이있어야합니다. 예외및반환처리 사용자가인쇄작업을취소한경우 addpage() 및 send() 호출을실행하기전에 PrintJob.start() 메서드가 true를반환하는지확인해야합니다. 계속진행하기에앞서이러한메서드가취소되었는지확인하는간단한방법은 if 문에서해당메서드를다음과같이래핑하는것입니다. if (myprintjob.start()) // 여기에 addpage() 및 send() 문을입력하십시오. PrintJob.start() 가 true이면사용자가 [ 인쇄 ] 를선택했거나 Flash Player에서 [ 인쇄 ] 명령을초기화했고 addpage() 및 send() 메서드를호출할수있음을의미합니다. 672 인쇄
또한인쇄프로세스를관리할수있도록이제 Flash Player에서 PrintJob.addPage() 메서드에대한예외를발생시키므로오류를포착하고사용자에게정보와옵션을제공할수있습니다. PrintJob.addPage() 메서드가실패하면다른함수를호출하거나현재인쇄작업을중지할수도있습니다. 다음예제와같이 try..catch 문내에 addpage() 호출을포함하여이러한예외를포착합니다. 예제에서 [params] 는실제인쇄할내용을지정하는매개변수의자리표시자입니다. if (myprintjob.start()) try myprintjob.addpage([params]); catch (error:error) // 오류를처리합니다. myprintjob.send(); 인쇄작업이시작되면 PrintJob.addPage() 를사용하여내용을추가할수있으며그로인해예외가생성되는지여부 ( 예 : 사용자가인쇄작업을취소했는지여부 ) 를확인할수있습니다. 예외가발생한경우 catch 문에논리를추가하여사용자 ( 또는 Flash Player) 에게정보와옵션을제공하거나현재인쇄작업을중지할수있습니다. 페이지를제대로추가하면계속해서 PrintJob.send() 를사용하여페이지를프린터로전송할수있습니다. Flash Player에서프린터에인쇄작업을보내는데문제가발생하는경우, 예를들어, 프린터가오프라인인경우이예외도포착하여사용자나 Flash Player에정보나추가옵션 ( 예 : 메시지텍스트표시또는 Flash 애니메이션내에경고표시 ) 을제공할수있습니다. 예를들어, 다음코드와같이 if..else 문의텍스트필드에새텍스트를지정할수있습니다. if (myprintjob.start()) try myprintjob.addpage([params]); catch (error:error) // 오류를처리합니다. myprintjob.send(); else myalert.text = "Print job canceled"; 작업예제는 679 페이지의 예제 : 배율조절, 자르기및자동맞춤 을참조하십시오. Flash Player 작업및시스템인쇄 673
페이지속성을사용한작업 사용자가 [ 인쇄 ] 대화상자에서 [ 확인 ] 을클릭하고 PrintJob.start() 가 true 를반환하면프린터설정에서정의한속성에액세스할수있습니다. 이러한속성에는용지폭, 용지높이 (pageheight 및 pagewidth) 및용지의내용방향등이있습니다. 이러한속성은프린터설정이므로 Flash Player 에서조절할수없으며이러한설정은변경할수없습니다. 그러나이러한속성을사용하여프린터로전송할내용을현재설정에맞게정렬할수있습니다. 자세한내용은 675 페이지의 크기, 배율및방향설정 을참조하십시오. 벡터또는비트맵렌더링설정 각페이지를벡터그래픽이나비트맵이미지로스풀링하도록인쇄작업을수동으로설정할수있습니다. 경우에따라벡터인쇄는비트맵인쇄보다더작은스풀파일을만들고더나은이미지를만듭니다. 그러나내용에비트맵이미지가있는경우알파투명도나색상효과를보존하려면페이지를비트맵이미지로인쇄해야합니다. 또한 PostScript 프린터가아닌프린터에서는자동으로벡터그래픽을비트맵이미지로변환합니다. 다음과같이 printasbitmap 매개변수를 true로설정한상태로 PrintJobOptions 객체를전달하여 PrintJob.addPage() 의세번째매개변수에서비트맵인쇄를지정합니다. var options:printjoboptions = new PrintJobOptions(); options.printasbitmap = true; myprintjob.addpage(mysprite, null, options); 세번째매개변수의값을지정하지않으면인쇄작업에서기본값 ( 벡터인쇄 ) 을사용합니다. 중요 printarea( 두번째매개변수 ) 값을지정하지않고비트맵인쇄값을지정하려면 printarea 에 null 을사용합니다. 인쇄작업시간제한명령문 ActionScript 3.0에서는이전버전의 ActionScript와달리 PrintJob 객체를단일프레임으로제한하지않습니다. 그러나사용자가 [ 인쇄 ] 대화상자에서 [ 확인 ] 버튼을클릭하면운영체제에서사용자에게인쇄상태정보를표시하므로 PrintJob.addPage() 및 PrintJob.send() 를최대한빠르게호출하여페이지를스풀러로보내야합니다. PrintJob.send() 호출이들어있는프레임에늦게도달하면인쇄과정이지연될수있습니다. ActionScript 3.0에서는 15초의스크립트시간초과제한이있습니다. 그러므로연속된인쇄작업에서각기본명령문사이의시간은 15초를초과할수없습니다. 즉, 다음간격에 15초스크립트시간초과제한이적용됩니다. PrintJob.start() 와첫번째 PrintJob.addPage() 사이 PrintJob.addPage() 와다음 PrintJob.addPage() 사이 마지막 PrintJob.addPage() 와 PrintJob.send() 사이 674 인쇄
이러한간격중하나가 15 초를초과하는경우다음에 PrintJob 인스턴스에서 PrintJob.start() 를호출하면 false 가반환되고다음에 PrintJob 인스턴스에서 PrintJob.addPage() 를반환하면 Flash Player 에서런타임예외가발생합니다. 크기, 배율및방향설정 671페이지의 페이지인쇄 섹션에는기본인쇄작업단계가자세히설명되어있습니다. 지정한스프라이트의화면크기와위치에해당하는인쇄내용이출력에직접반영됩니다. 그러나프린터에서인쇄할때다른해상도를사용하고, 인쇄된스프라이트의모양에영향을주는설정이있을수있습니다. Flash Player는운영체제의인쇄설정을읽을수있지만이러한속성은읽기전용입니다. 인쇄설정값에응답할수는있지만설정할수는없습니다. 그러므로예를들어, 프린터의용지크기설정을알아보고그크기에맞게내용을조정할수있습니다. 또한프린터의여백설정과페이지방향도확인할수있습니다. 프린터설정에응답하려면인쇄영역을지정하거나, 화면해상도와프린터의포인트측정단위간에차이를조정하거나, 내용을사용자프린터의크기나방향설정에맞게변형해야할수있습니다. 인쇄영역에사각형사용 PrintJob.addPage() 메서드를사용하면인쇄할스프라이트의영역을지정할수있습니다. 두번째매개변수인 printarea는 Rectangle 객체의양식에있습니다. 이매개변수에값을제공하는옵션은다음세가지입니다. 다음예제와같이특정속성이있는 Rectangle 객체를만든다음 addpage() 호출에서해당사각형을사용합니다. private var rect1:rectangle = new Rectangle(0, 0, 400, 200); myprintjob.addpage(sheet, rect1); 아직 Rectangle 객체를지정하지않은경우다음예제와같이호출자체내에서지정할수있습니다. myprintjob.addpage(sheet, new Rectangle(0, 0, 100, 100)); addpage() 호출에서세번째매개변수의값은제공할계획이지만사각형을지정하지않으려면다음과같이두번째매개변수에 null을사용할수있습니다. myprintjob.addpage(sheet, null, options); 중요 인쇄크기에사각형을지정하려는경우 flash.display.rectangle 클래스를가져와야합니다. 크기, 배율및방향설정 675
포인트와픽셀비교 사각형의폭과높이는픽셀값입니다. 프린터에서는인쇄측정단위로포인트를사용합니다. 포인트는고정된실제크기 (1/72인치) 이지만화면상픽셀의크기는특정화면의해상도에따라다릅니다. 픽셀과포인트사이의변환비율은프린터설정및스프라이트의배율조절여부에따라다릅니다. 폭이 72픽셀이고배율이조절되지않은스프라이트는폭이 1인치로인쇄되며이때 1포인트는화면해상도에관계없이 1픽셀과같습니다. 인치나센티미터를트윕또는포인트 (1트윕은 1/20포인트 ) 로변환할때다음등식을사용할수있습니다. 1포인트 = 1/72인치 = 20트윕 1인치 = 72포인트 = 1440트윕 1센티미터 = 567트윕 printarea 매개변수가생략되거나잘못전달되면스프라이트의전체영역이인쇄됩니다. 배율조절 인쇄하기전에 Sprite 객체의배율을조절하려면 PrintJob.addPage() 메서드를호출하기전에배율속성 (378페이지의 객체크기조작및크기조절 참조 ) 을설정하고인쇄후속성을원래값으로다시설정합니다. Sprite 객체의배율은 printarea 속성과관계가없습니다. 즉, 인쇄영역을 50 x 50픽셀로지정하면 2500픽셀이인쇄됩니다. Sprite 객체의배율을조절하면동일하게 2500픽셀이인쇄되지만 Sprite 객체는배율이조절된크기로인쇄됩니다. 예제는 679페이지의 예제 : 배율조절, 자르기및자동맞춤 을참조하십시오. 가로또는세로방향으로인쇄 Flash Player에서방향설정을감지할수있으므로다음예제와같이 ActionScript에논리를작성하여프린터설정에맞게현재크기나회전을조절할수있습니다. if (myprintjob.orientation == PrintJobOrientation.LANDSCAPE) mysprite.rotation = 90; 중요 용지에서내용방향에대한시스템설정을읽으려는경우다음을사용하여 PrintJobOrientation 클래스를가져와야합니다. import flash.printing.printjoborientation; PrintJobOrientation 클래스는페이지에서내용방향을정의하는상수값을제공합니다. 676 인쇄
페이지높이와폭에자동맞춤 프린터방향설정을처리하는것과비슷한방법을사용하면 if 문에일부논리를포함함으로써페이지높이와폭설정을읽은후그에맞게조정할수있습니다. 다음은예제코드입니다. if (mysprite.height > myprintjob.pageheight) mysprite.scaley =.75; 뿐만아니라다음예제와같이페이지와용지의크기를비교하여페이지의여백설정을확인할수있습니다. margin_height = (myprintjob.paperheight - myprintjob.pageheight) / 2; margin_width = (myprintjob.paperwidth - myprintjob.pagewidth) / 2; 예제 : 여러페이지인쇄 두페이지이상의내용을인쇄할때각페이지의내용을다른스프라이트 ( 이예제에서는 sheet1과 sheet2) 와연결한다음각스프라이트에대해 PrintJob.addPage() 를사용할수있습니다. 다음코드는이기술을보여줍니다. package import flash.display.movieclip; 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 PrintMultiplePages extends MovieClip private var sheet1:sprite; private var sheet2:sprite; public function PrintMultiplePages():void init(); printpages(); private function init():void sheet1 = new Sprite(); createsheet(sheet1, "Once upon a time...", x:10, y:50, width:80, height:130); sheet2 = new Sprite(); 예제 : 여러페이지인쇄 677
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 printpages():void var pj:printjob = new PrintJob(); var pagestoprint:uint = 0; if (pj.start()) if (pj.orientation == PrintJobOrientation.LANDSCAPE) throw new Error("Page is not set to an orientation of portrait."); sheet1.height = pj.pageheight; sheet1.width = pj.pagewidth; sheet2.height = pj.pageheight; sheet2.width = pj.pagewidth; try pj.addpage(sheet1); 678 인쇄
pagestoprint++; catch (error:error) // 오류에응답합니다. try pj.addpage(sheet2); pagestoprint++; catch (error:error) // 오류에응답합니다. if (pagestoprint > 0) pj.send(); 예제 : 배율조절, 자르기및자동맞춤 경우에따라화면상에표시되는방식과용지에인쇄되는방식의차이에따라인쇄할때표시객체의크기나다른속성을조절할수있습니다. scalex 및 scaley 속성을사용하는등인쇄하기전에표시객체의속성을조절할때객체크기가인쇄영역에정의된사각형보다크면객체가잘립니다. 페이지를인쇄한후에는속성을원래대로설정할수도있습니다. 다음코드에서는 txt 표시객체 ( 녹색상자배경제외 ) 의크기를조절하고지정된사각형의크기에따라텍스트필드가잘립니다. 인쇄한후에는텍스트필드가화면상에표시되는원래크기로돌아갑니다. 사용자가운영체제의 [ 인쇄 ] 대화상자에서인쇄작업을취소하면 Flash Player의내용이변경되어작업을취소한사용자에게경고를표시합니다. package import flash.printing.printjob; import flash.display.sprite; import flash.text.textfield; import flash.display.stage; import flash.geom.rectangle; public class PrintScaleExample extends Sprite 예제 : 배율조절, 자르기및자동맞춤 679
private var bg:sprite; private var txt:textfield; public function PrintScaleExample():void init(); draw(); printpage(); private function printpage():void var pj:printjob = new PrintJob(); txt.scalex = 3; txt.scaley = 2; if (pj.start()) trace(">> pj.orientation: " + pj.orientation); trace(">> pj.pagewidth: " + pj.pagewidth); trace(">> pj.pageheight: " + pj.pageheight); trace(">> pj.paperwidth: " + pj.paperwidth); trace(">> pj.paperheight: " + pj.paperheight); try pj.addpage(this, new Rectangle(0, 0, 100, 100)); catch (error:error) // 아무작업도수행하지않습니다. pj.send(); else txt.text = "Print job canceled"; // txt 배율속성을재설정합니다. txt.scalex = 1; txt.scaley = 1; private function init():void bg = new Sprite(); bg.graphics.beginfill(0x00ff00); bg.graphics.drawrect(0, 0, 100, 200); bg.graphics.endfill(); txt = new TextField(); 680 인쇄
txt.border = true; txt.text = "Hello World"; private function draw():void addchild(bg); addchild(txt); txt.x = 50; txt.y = 50; 예제 : 배율조절, 자르기및자동맞춤 681
682 인쇄