Doc

Doc (문서)

Doc 인터페이스는 인쇄 작업(Print Job)에 한 조각의 인쇄 데이터를 공급하는 객체의 인터페이스를 지정해요. "Doc"은 "한 조각의 인쇄 데이터"를 뜻하는 짧고 발음하기 쉬운 용어예요. 클라이언트는 Doc 인터페이스를 구현하는 객체를 인쇄 작업에 전달하고, 인쇄 작업은 그 객체에 메서드를 호출해 인쇄 데이터를 얻어요.

출처: Java API Reference

본문

Doc 인터페이스는 인쇄 작업이 다음을 할 수 있게 해요.

  • 인쇄 데이터가 제공되는 형식인 "doc flavor"(클래스 DocFlavor)를 결정한다. doc flavor는 인쇄 데이터 형식(MIME 타입)과 인쇄 데이터가 나오는 객체의 표현 클래스를 지정한다.
  • 인쇄 데이터 표현 객체를 얻는다. doc flavor의 표현 클래스의 인스턴스이며, 인쇄 작업은 그로부터 실제 인쇄 데이터를 얻을 수 있다.
  • 문서의 추가 특성을 지정하거나 문서에 적용할 처리 지침을 지정하는 인쇄 속성을 얻는다. 속성은 javax.print.attribute 패키지에 정의돼 있다. 문서는 javax.print.attribute.DocAttributeSet에 저장된 인쇄 속성을 반환한다.

각 메서드는 호출할 때마다 항상 같은 객체를 반환할 수 있어요. 이는 표현 객체가 스트림처럼 인쇄 데이터를 "소비"하는 경우 함의가 있어요. 인쇄 작업이 getPrintData()를 호출해 스트림을 얻은 후, 추가 getPrintData() 호출은 시작부터 다시 읽는 새 스트림이 아니라 이미 읽기 진행 중일 수 있는 같은 스트림 객체를 반환해요. 이는 특정 doc이 하나의 인쇄 작업에만 인쇄 데이터를 전달하려는 것이므로 정당해요.

인쇄 데이터는 doc 객체 생성 시 이미 존재할 수 있어요. 이 경우 반환되는 객체는 미리 저장됐다가 요청 시 반환될 수 있어요. 또는 인쇄 데이터가 아직 없을 수도 있는데, 이 경우 doc 객체는 인쇄 작업이 요청할 때만(즉 getPrintData() 호출 시) 데이터를 생성하는 "지연" 구현을 제공할 수 있어요.

같은 doc에 동시에 접근하는 클라이언트 스레드 수에는 제한이 없어요. 따라서 모든 Doc 구현은 다중 스레드 안전하게 설계돼야 해요. 다만 Doc에서 얻은 인쇄 데이터의 소비자는 하나만 있을 수 있어요.

메서드

  • getDocFlavor(): 이 doc 객체가 자신의 인쇄 데이터 조각을 공급할 doc flavor를 결정해요.
  • getPrintData(): 지원되는 doc flavor에 해당하는 형식으로 이 doc 객체의 인쇄 데이터 조각을 담고 있는 인쇄 데이터 표현 객체를 얻어요. getDocFlavor().getRepresentationClassName()이 주는 이름의 표현 클래스 인스턴스를 반환하며 Object에서 그 표현 클래스로 캐스팅할 수 있어요. 표현 클래스가 스트림이고 스트림 구성 중 I/O 오류가 있으면 IOException을 던져요.
  • getAttributes(): 이 doc 객체의 인쇄 속성 집합을 얻어요. 반환 집합에 특정 속성 X의 인스턴스가 있으면 프린터는 작업의 속성 집합에 있는 X 값을 재정의하고 이 속성 값을 이 문서에 사용해야 해요. 없거나 null이면 프린터는 작업의 속성 집합에서 X 값을 얻고, 거기에도 없으면 구현 종속 기본값을 사용해야 해요. 반환 집합은 수정 불가예요.
  • getReaderForText(): 이 doc의 문자 인쇄 데이터를 추출하는 reader를 얻어요. doc flavor가 char[], java.lang.String, java.io.Reader 표현 클래스 중 하나면 지원하고, 그 외엔 null을 반환해요. 표현 객체가 이미 Reader면 그것을 그대로 반환해요. I/O 오류가 있으면 IOException을 던져요.
  • getStreamForBytes(): 이 doc의 바이트 인쇄 데이터를 추출하는 입력 스트림을 얻어요. doc flavor가 byte[], java.io.InputStream 표현 클래스 중 하나면 지원하고, 그 외엔 null을 반환해요. 표현 객체가 이미 입력 스트림이면 그것을 그대로 반환해요. I/O 오류가 있으면 IOException을 던져요.

더 알아보기