| Package | flash.printing |
| Class | public class PrintJob |
| Inheritance | PrintJob EventDispatcher Object |
인쇄 작업을 작성하기 시작하려면 , constructor PrintJob() 를 사용합니다.
게다가PrintJob.start() 에 의해 얻을 수 있는 property를 사용하면, 문서로부터 유저의 프린터 설정 (용지의 높이, 폭, 이미지의 방향등)에 액세스 할 수가 있어 프린터의 설정에 맞추어 Flash 의 컨텐츠를 동적으로 포맷 하도록(듯이) 문서를 구성할 수가 있습니다. PrintJob.start() 에 의해 포함되는 이러한 레이아웃 property는 읽기 전용(read-only)으로, Flash Player 로 변경할 수 없습니다.
메모 : ActionScript 3.0 에서는, ActionScript 의 이전의 버젼과 같게, PrintJob object가 단일 프레임에 제한되지 않습니다. 다만,[인쇄] 다이알로그 박스로 [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 는 런타임 예외를 슬로우 합니다.
See also
| property | 정의 | ||
|---|---|---|---|
![]() | constructor : Object
특정의 object 인스턴스의 클래스 object 또는 constructor 함수에의 참조입니다.
| Object | |
| orientation : String
[read-only]
인쇄하는 이미지의 방향.
| PrintJob | ||
| pageHeight : int
[read-only]
페이지상에서 실제로 인쇄 가능한 area의 높이 (포인트 단위)
| PrintJob | ||
| pageWidth : int
[read-only]
페이지상에서 실제로 인쇄 가능한 area의 폭 (포인트 단위).
| PrintJob | ||
| paperHeight : int
[read-only]
용지 전체의 높이 (포인트 단위)
| PrintJob | ||
| paperWidth : int
[read-only]
용지 전체의 폭 (포인트 단위)
| PrintJob | ||
![]() | prototype : Object
[static]
클래스 또는 함수 object의 prototype object에의 참조입니다.
| Object | |
| Methods | 정의 | ||
|---|---|---|---|
| PrintJob ()
페이지를 인쇄할 수 있는 PrintJob object를 작성합니다.
| PrintJob | ||
![]() | addEventListener (type:String , listener:Function , useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
event listener objects를 EventDispatcher object에 등록해, listener가 이벤트의 통지를 받도록(듯이) 합니다.
| EventDispatcher | |
| addPage (sprite:Sprite , printArea:Rectangle = null, options:PrintJobOptions = null, frameNum:int = 0):void
지정의 Sprite object를 1 페이지로서 인쇄 스풀러에 보냅니다.
| PrintJob | ||
![]() | dispatchEvent (event:Event ):Boolean
이벤트를 event 플로우(flow)에 dispatch합니다.
| EventDispatcher | |
![]() | hasEventListener (type:String ):Boolean
EventDispatcher object에, 특정의 event 타입에 대해서 등록된 listener가 있을지 어떨지를 확인합니다.
| EventDispatcher | |
![]() | hasOwnProperty (name:String ):Boolean
object로 지정된 property가 정의되고 있는지 어떤지를 나타냅니다.
| Object | |
![]() | isPrototypeOf (theClass:Object ):Boolean
Object 클래스의 인스턴스가, Parameters로서 지정된 object의 prototype 체인내에 있을지 어떨지를 나타냅니다.
| Object | |
![]() | propertyIsEnumerable (name:String ):Boolean
지정된 property가 존재해, 열거 가능한가 어떤가를 나타냅니다.
| Object | |
![]() | removeEventListener (type:String , listener:Function , useCapture:Boolean = false):void
EventDispatcher object로부터 listener를 삭제합니다.
| EventDispatcher | |
send ():void
PrintJob.start() 와 PrintJob.addPage() 가 성공한 후, spool 한 페이지를 프린터에 송신합니다. | PrintJob | ||
![]() | setPropertyIsEnumerable (name:String , isEnum:Boolean = true):void
루프 처리에 대한 다이나믹 property의 가용성을 설정합니다.
| Object | |
| start ():Boolean
operating system의 [인쇄] 다이알로그 박스를 표시해, spool를 개시해, PrintJob 의 읽기 전용(read-only) property치를 설정합니다.
| PrintJob | ||
![]() | toString ():String
지정된 object의 string 표현을 돌려줍니다.
| Object | |
![]() | valueOf ():Object
지정된 object의 원시적치를 돌려줍니다.
| Object | |
![]() | willTrigger (type:String ):Boolean
지정된 event 타입에 대해, 이 EventDispatcher object 또는 그 조상에게 event listener가 등록되어 있는지 어떤지를 확인합니다.
| EventDispatcher | |
| orientation | property |
orientation:String [read-only]
인쇄하는 이미지의 방향. 이 property는 PrintJobOrientation 클래스로부터의 값입니다. 이 property는,PrintJob.start() Methods의 호출 후에게만 사용 가능하게 됩니다.
public function get orientation():String
See also
| pageHeight | property |
pageHeight:int [read-only]
페이지상에서 실제로 인쇄 가능한 area의 높이 (포인트 단위) 유저가 설정한 margin는 포함하지 않습니다. 이 property는,PrintJob.start() Methods의 호출 후에게만 사용 가능하게 됩니다.
public function get pageHeight():int
See also
| pageWidth | property |
pageWidth:int [read-only]
페이지상에서 실제로 인쇄 가능한 area의 폭 (포인트 단위). 유저가 설정한 margin는 포함하지 않습니다. 이 property는,PrintJob.start() Methods의 호출 후에게만 사용 가능하게 됩니다.
public function get pageWidth():int
See also
| paperHeight | property |
paperHeight:int [read-only]
용지 전체의 높이 (포인트 단위) 이 property는,PrintJob.start() Methods의 호출 후에게만 사용 가능하게 됩니다.
public function get paperHeight():int
| paperWidth | property |
paperWidth:int [read-only]
용지 전체의 폭 (포인트 단위) 이 property는,PrintJob.start() Methods의 호출 후에게만 사용 가능하게 됩니다.
public function get paperWidth():int
| PrintJob | () | constructor |
public 함수 PrintJob()
페이지를 인쇄할 수 있는 PrintJob object를 작성합니다. PrintJob object를 작성하면,PrintJob.start(),PrintJob.addPage(),PrintJob.send() 의 순서에 Methods를 사용해, 프린터에 인쇄 작업을 송신합니다.
예를 들어 다음의 코드에 나타나는 my_pj.addPage() Methods 호출의 [params] 플레이스홀더-텍스트를 custom Parameters와 옮겨놓고 할 수 있습니다.
// create PrintJob object
var my_pj:PrintJob = new PrintJob();
// display Print dialog box, but only initiate the print job
// if start returns successfully.
if (my_pj.start()) {
// add specified page to print job
// repeat once for each page to be printed
try {
my_pj.addPage([params]);
}
catch(e:Error) {
// handle error
}
try {
my_pj.addPage([params]);
}
catch(e:Error) {
// handle error
}
// send pages from the spooler to the printer, but only if one or more
// calls to addPage() was successful. You should always check for successful
// calls to start() and addPage() before calling send().
my_pj.send();
}
최초의 PrintJob object가 액티브한 사이는, 2 번째의 PrintJob object를 작성할 수 없습니다. 1 번째의 PrintJob object가 액티브하다라고 나무에 new PrintJob() 를 호출해 2 번째의 PrintJob object를 작성하려고 해도, 2 번째의 PrintJob object는 생성되지 않습니다. 그 때문에 2 번째의 PrintJob 를 작성하기 전에 my_pj 값를 확인할 수가 있습니다.
IllegalOperationError — 별의 PrintJob object가 액티브한 그대로인 경우는, 예외를 슬로우 합니다.
|
See also
| addPage | () | Methods |
public function addPage(sprite:Sprite , printArea:Rectangle = null, options:PrintJobOptions = null, frameNum:int = 0):void
지정의 Sprite object를 1 페이지로서 인쇄 스풀러에 보냅니다. 이 Methods를 사용하기 전에, PrintJob object를 작성해,PrintJob.start() 를 사용할 필요가 있습니다. 다음에, 인쇄 작업에 대해서 PrintJob.addPage() 를 1 회 또는 여러 차례 호출한 후,
PrintJob.send() 를 사용해, spool 한 페이지를 프린터에 송신합니다. 즉, PrintJob object를 작성하면,PrintJob.start(),
PrintJob.addPage(),PrintJob.send() 의 순서에 Methods를 사용해, 프린터에 인쇄 작업을 송신합니다. PrintJob.start() 를 1 회 호출한 다음에 PrintJob.addPage() 를 여러 차례 사용하는 것으로써, 복수의 페이지를 1 회에 인쇄할 수 있습니다.
PrintJob.addPage() 에 의해 Flash Player 가 예외를 슬로우 했을 경우 (PrintJob.start() 를 호출하지 않은 경우나, 유저가 인쇄 작업을 캔슬했을 경우등)는, 그 후로 PrintJob.addPage() 를 호출하면 실패합니다. 다만, 그때까지 PrintJob.addPage() 의 호출이 성공하고 있으면, 마지막에 PrintJob.send() 커멘드를 실행하는 것으로, spool에 성공한 모든 페이지가 프린터에 보내집니다.
인쇄 작업으로 PrintJob.addPage() 조작의 완료에 15 초 이상 걸리는 경우, Flash Player 는, 다음번의 Print.addPage() 의 호출해에 예외를 슬로우 합니다.
printArea Parameters의 값을 건네주면,printArea object의 x 좌표와 y 좌표가 페이지의 인쇄 가능 area의 좌상구석 (0,0 좌표)에 대응합니다. 인쇄 가능 area는,PrintJob.start() 로 설정한 읽기 전용(read-only)의 pageHeight property와 pageWidth property로 나타내집니다. 인쇄 결과는 페이지상의 인쇄 가능 area의 좌상구석을 기준에 정렬되므로,printArea 로 정의한 area가 용지상의 인쇄 가능 area보다 큰 경우는,printArea 로 정의한 area의 우측 또는 아래 쪽의 부분 (또는 그 양쪽 모두)은 잘라내지는 일이 있습니다. printArea 의 값을 지정하지 않는 경우에 스테이지가 인쇄 가능 area보다 클 때도, 같은 절취가 발생합니다. printArea 의 값을 지정하지 않는 경우에 스크린이 인쇄 가능 area보다 클 때도, 같은 절취가 발생합니다.
인쇄전에 Sprite object를 확대/축소하려면 , 이 Methods를 호출하기 전에 확대·축소의 property (flash.display.DisplayObject.scaleX 및 flash.display.DisplayObject.scaleY 를 참조)를 설정합니다. 인쇄 후, 이러한 property를 원의 값에 되돌립니다. Sprite object의 확대·축소는,printArea 와는 무관계합니다. 즉, 크기가 50 x 50 픽셀의 area를 인쇄하도록(듯이) 지정했을 경우, 2500 픽셀이 인쇄됩니다. Sprite object를 확대 또는 축소하고 있는 경우, 그 설정을 반영해 프린트 결과는 신축합니다만, 프린트의 대상이 되는 2500 개의 픽셀은 바뀌지 않습니다.
Flash Player 의 인쇄 기능은, PostScript 프린터와 비 PostScript 프린터를 지원(support)하고 있습니다. 비 PostScript 프린터에서는, 벡터는 비트 맵에 변환됩니다.
Parameterssprite:Sprite — 인쇄하는 Sprite 의 인스턴스명.
|
|
printArea:Rectangle (default = null) — 인쇄하는 area를 지정하는 Rectangle object.
구형의 폭과 높이는 픽셀치입니다. 프린터에서는, 인쇄용의 측정 단위로서 포인트를 사용합니다. 포인트는 물리적인 고정 크기 (1/72 인치)입니다만, 화면용의 픽셀 심도의 크기는 화면의 해상도에 따라서 다릅니다. 그 때문에 픽셀과 포인트의 사이의 변환 레이트는, 프린터의 설정, 및 Sprite 가 신축되고 있는지 어떤지에 의해 정해집니다. 72 픽셀폭의 신축되어 있지 않은 스프라이트는, 용지상에는 1 인치폭으로 프린트 됩니다. 화면의 해상도와는 관계없이, 1 포인트가 1 픽셀에 대응합니다. 인치 및 센티미터와 포인트 및 twip (1/20 포인트)와의 사이에는, 다음의 등식이 성립됩니다.
|
|
options:PrintJobOptions (default = null) — 벡터와 비트 맵의 어디에서 인쇄하는지를 지정하는, 옵션의 Parameters. 디폴트치는 null 로, 이것은 벡터 형식을 나타냅니다. sprite 를 비트 맵으로서 인쇄하려면 , PrintJobOptions object의 printAsBitmap property를 true 로 설정합니다. printAsBitmap 를 true 로 설정할지 어떨지를 결정할 때는, 다음의 항목에 유의해 주세요.
|
|
frameNum:int (default = 0) — 인쇄하는 프레임을 지정할 수 있는 옵션의 수치. frameNum 를 건네주어도, 그 프레임의 ActionScript 는 불려 가지 않습니다. 이 Parameters를 생략 하면,sprite 내의 현재의 프레임이 인쇄됩니다. Flash 오쏘링 환경에서 사용할 수 있는 옵션의 수치. Flex 어플리케이션을 기술하는 경우에는, 이 Parameters를 생략 하는지, 값 0 을 지정합니다. 메모 : |
Error — PrintJob.start() 를 호출하지 않았던 경우, 또는 유저가 인쇄 작업을 캔슬했을 경우, 예외가 슬로우 됩니다.
|
See also
| send | () | Methods |
public function send():void
PrintJob.start() 와 PrintJob.addPage() 가 성공한 후, spool 한 페이지를 프린터에 송신합니다. PrintJob.start() 의 호출이 실패했을 경우, 또는 PrintJob.addpage() 가 예외를 슬로우 했을 경우,PrintJob.send() 의 호출은 성공하지 않습니다. 그 때문에 PrintJob.start() 가 true 를 돌려주는 것을 확인해,PrintJob.send() 의 호출전에 PrintJob.addpage() 예외를 캐치 해 주세요. 다음에 예를 나타냅니다.
var my_pj:PrintJob = new PrintJob();
if (my_pj.start()) {
try {
my_pj.addPage([params]);
}
catch(e:Error) {
// 에러를 처리합니다
}
my_pj.send();
}
See also
| start | () | Methods |
public function start():Boolean
operating system의 [인쇄] 다이알로그 박스를 표시해, spool를 개시해, PrintJob 의 읽기 전용(read-only) property치를 설정합니다. 유저는 [인쇄] 다이알로그 박스로 인쇄 설정을 변경할 수 있습니다. PrintJob.start() Methods가 정상적으로 돌려주어졌을 경우, 즉 유저가 [인쇄] 다이알로그 박스로 [OK] 를 클릭했을 경우, 다음의 읽기 전용(read-only) property에 값이 건네받아 유저의 현재의 인쇄 설정을 나타냅니다.
| property | 타입 | 단위 | 메모 |
|---|---|---|---|
PrintJob.paperHeight | Number | 포인트 | 용지의 높이 |
PrintJob.paperWidth | Number | 포인트 | 용지 전체의 폭 |
PrintJob.pageHeight | Number | 포인트 | 용지상의 실제의 인쇄 가능 area의 높이. 유저가 설정한 margin는 포함하지 않습니다. |
PrintJob.pageWidth | Number | 포인트 | 용지상의 실제의 인쇄 가능 area의 폭. 유저가 설정한 margin는 포함하지 않습니다. |
PrintJob.orientation | String | "portrait" (flash.printing.PrintJobOrientation.PORTRAIT) 또는 "landscape" (flash.printing.PrintJobOrientation.LANDSCAPE). |
메모 : [인쇄] 다이알로그 박스로 캔슬되면, property가 설정되지 않습니다.
유저가 [인쇄] 다이알로그 박스로 [OK] 를 클릭하면, operating system에의 인쇄 작업의 spool가 개시됩니다. operating system로 인쇄의 진행 상황에 대해 정보가 표시되기 (위해)때문에, 페이지를 스풀러에 송신하면 즉시 PrintJob.addPage() 및 PrintJob.send() 를 호출할 필요가 있습니다. 이 Methods에 값을 건네주는 읽기 전용(read-only)의 높이, 폭, 방향의 property를 사용해, 인쇄 결과를 포맷 할 수 있습니다.
PrintJob.addPage() 나 PrintJob.send() 를 호출하기 전에, 이 Methods가 true 를 돌려주는 것 (유저가 operating system의 [인쇄] 다이알로그 박스로 [OK] 를 클릭했을 경우)를 확인하기 위해서, 테스트를 실시합니다.
var my_pj:PrintJob = new PrintJob();
if (my_pj.start()) {
// 여기에 addPage() 및 send() 명령문(statement)를 기술
}
지정된 인쇄 작업 인스턴스의 경우, 다음의 몇개의 간격이 15 초 이상인 경우, 다음번의 PrintJob.start() 를 호출하면 false 가 돌려주어집니다.
PrintJob.start() 및 1 번째의 PrintJob.addPage()PrintJob.addPage() 및 2 번째의 PrintJob.addPage()PrintJob.addPage() 및 PrintJob.send()Boolean —
[인쇄] 다이알로그 박스로 유저가 [OK] 를 클릭했을 경우는 true, 유저가 [캔슬] 을 클릭했을 경우, 또는 에러가 발생했을 경우는 false 를 돌려줍니다.
|
See also
PrintJobExample 클래스를 사용해, 작은 문서를 작성해,
그 문서를 프린터에 송신합니다 여기에서는 이하의 순서를 실행합니다.
sheet1 와 sheet2 를 선언합니다. init() 를 호출합니다. 이것에 의해, 새로운 Sprite 인스턴스가 sheet1 및
sheet2 에 할당할 수 있어 다음에 다른 인수로 createSheet() 가 불려 갑니다. createSheet() 에 의해 다음 일을 실시합니다. txt 라는 이름의 새로운 TextField object가 작성됩니다. 이 object의 크기는
Sprite 와 같아, wordWrap property는 true, 텍스트 property는
createSheet()img 로, 흰 사각형을 묘화 하기 위해서 사용됩니다. 이 사각형의 좌표와 크기의 property는
건네받은 Object 의 값이 사용됩니다. 다음을 호출해, 흰 사각형을 Sprite object 보기 리스트에 추가합니다.
addChild(). txt TextField 를 Sprite object 보기 리스트에 추가합니다.
addChild(). printOnePerPage() 에 대해 다음에 설명합니다. printOnePerPage() 에 의해 다음 일을 실시합니다. pj 라고 하는 새로운 PrintJob object와 단위로서 pagesToPrint 를 선언합니다. OKsheet1 및 sheet2addPage()sheet1 및 sheet2 를 인쇄 스풀러에 송신합니다.
draw() Methods가 불려 갑니다. 이 Methods는, 스테이지에 맞도록(듯이) 2 개의 Sprite property의 크기를 변경해,
sheet1sheet2 의 위치를 변경합니다.
메모 : constructor 이 설정되어 3 개의 인쇄 Methods의 언젠가 ( 1 페이지 근처 1 시트,
1 페이지 근처 2 시트, 페이지의 상반분만 인쇄)를 환경 설정에 응해 선택할 수 있게 됩니다.
인쇄 Methods의 쳐 정확히 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;
}
}
}
코멘트가 추가되었을 경우, 메일로 받기. | 코멘트 리포트
현재의 페이지: http://flexdocs.kr/docs/flex2/langref/flash/printing/PrintJob.html