수색…


소개

Java Print Service API인쇄 서비스 를 발견하고 인쇄 서비스를 보내기위한 기능을 제공합니다.

여기에는 IETF 사양 RFC 2911인터넷 인쇄 프로토콜 (IPP) 1.1에 지정된 표준 속성을 기반으로하는 확장 가능한 인쇄 특성이 포함됩니다.

사용 가능한 인쇄 서비스 발견

사용 가능한 모든 인쇄 서비스를 검색하기 위해 PrintServiceLookup 클래스를 사용할 수 있습니다. 어떻게 보자 :

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class DiscoveringAvailablePrintServices {

    public static void main(String[] args) {
        discoverPrintServices();
    }

    public static void discoverPrintServices() {
        PrintService[] allPrintServices = PrintServiceLookup.lookupPrintServices(null, null);
        
        for (Printservice printService : allPrintServices) {
            System.out.println("Print service name: " + printService.getName());
        }
    }

}

이 프로그램은 Windows 환경에서 실행될 때 다음과 같이 인쇄됩니다.

Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer

기본 인쇄 서비스 발견

기본 인쇄 서비스를 검색하기 위해 PrintServiceLookup 클래스를 사용할 수 있습니다. 어떻게 보자 ::

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class DiscoveringDefaultPrintService {

    public static void main(String[] args) {
        discoverDefaultPrintService();
    }

    public static void discoverDefaultPrintService() {
        PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
        System.out.println("Default print service name: " + defaultPrintService.getName());
    }

}

인쇄 서비스에서 인쇄 작업 만들기

인쇄 작업은 특정 인쇄 서비스에서 인쇄 할 것을 요구합니다. 기본적으로 다음과 같이 구성됩니다.

올바른 인쇄 서비스 인스턴스를 수집 한 후 인쇄 작업 생성을 요청할 수 있습니다.

DocPrintJob printJob = printService.createPrintJob();

DocPrintJob 인터페이스는 print 메소드를 제공합니다.

printJob.print(doc, pras);

doc 인수는 Doc : 인쇄 될 데이터입니다.

pras 인수는 PrintRequestAttributeSet 인터페이스입니다. PrintRequestAttribute 입니다. 인쇄 요청 속성의 예는 다음과 같습니다.

  • 복사 량 (1, 2 등),
  • 방향 (세로 또는 가로)
  • 색도 (단색, 컬러)
  • 품질 (초안, 보통, 높음)
  • 측면 (단면, 양면 등)
  • 등등...

print 메소드는 PrintException 던질 수 있습니다.

인쇄 할 문서 작성

Doc 는 인터페이스이며, Java Print Service API는 SimpleDoc 이라 불리는 간단한 구현을 제공합니다.

모든 Doc 인스턴스는 기본적으로 두 가지 측면으로 구성됩니다.

  • 인쇄 데이터 내용 자체 (전자 메일, 이미지, 문서 등)
  • DocFlavor (MIME 타입 + 표현 클래스)라고 불리는 인쇄 데이터 포맷.

Doc 객체를 생성하기 전에 우리는 어딘가에서 문서를로드해야한다. 이 예에서는 디스크에서 특정 파일을로드합니다.

FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");

이제 우리는 우리의 내용과 일치하는 DocFlavor 를 선택해야 DocFlavor . DocFlavor 클래스에는 가장 일반적인 유형의 데이터를 나타내는 많은 상수가 있습니다. INPUT_STREAM.PDF 선택하자.

DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;

이제 SimpleDoc 의 새 인스턴스를 만들 수 있습니다.

Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);

이제 doc 객체를 인쇄 작업 요청으로 보낼 수 있습니다 ( 인쇄 서비스에서 인쇄 작업 만들기 참조).

인쇄 요청 속성 정의

때로는 인쇄 요청의 일부 측면을 결정해야합니다. 우리는 그것들을 속성 이라고 부를 것 입니다 .

인쇄 요청 속성의 예는 다음과 같습니다.

  • 복사 량 (1, 2 등),
  • 방향 (세로 또는 가로)
  • 색도 (단색, 컬러)
  • 품질 (초안, 보통, 높음)
  • 측면 (단면, 양면 등)
  • 등등...

그 중 하나를 선택하기 전에 각각의 값을 가질 가치가있는 속성 집합을 만들어야합니다.

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

이제 우리는 그것을 추가 할 수 있습니다. 몇 가지 예는 다음과 같습니다.

pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);

이제 pras 객체를 인쇄 작업 요청으로 보낼 수 있습니다 ( 인쇄 서비스에서 인쇄 작업 만들기 참조).

청취 인쇄 작업 요청 상태 변경

대부분의 인쇄 클라이언트의 경우 인쇄 작업이 완료되었는지 또는 실패했는지 알면 매우 유용합니다.

Java Print Service API는 이러한 시나리오에 대한 정보를 얻을 수있는 몇 가지 기능을 제공합니다. 우리가해야 할 일은 다음과 같습니다.

  • PrintJobListener 인터페이스 구현을 제공하고
  • 이 구현을 인쇄 작업에 등록합니다.

인쇄 작업 상태가 변경되면 알림이 전송됩니다. 우리는 무엇이든 할 수 있습니다. 예를 들면 다음과 같습니다.

  • 사용자 인터페이스 업데이트,
  • 다른 비즈니스 프로세스 시작,
  • 데이터베이스에 무엇인가를 기록하고,
  • 또는 단순히 기록하십시오.

아래의 예제에서는 모든 인쇄 작업 상태 변경 사항을 기록합니다 :

import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;

public class LoggerPrintJobListener implements PrintJobListener {

    // Your favorite Logger class goes here!
    private static final Logger LOG = Logger.getLogger(LoggerPrintJobListener.class);


    public void printDataTransferCompleted(PrintJobEvent pje) {
        LOG.info("Print data transfer completed ;) ");
    }

    public void printJobCompleted(PrintJobEvent pje) {
        LOG.info("Print job completed =) ");
    }

    public void printJobFailed(PrintJobEvent pje) {
        LOG.info("Print job failed =( ");
    }

    public void printJobCanceled(PrintJobEvent pje) {
        LOG.info("Print job canceled :| ");
    }

    public void printJobNoMoreEvents(PrintJobEvent pje) {
        LOG.info("No more events to the job ");
    }

    public void printJobRequiresAttention(PrintJobEvent pje) {
        LOG.info("Print job requires attention :O ");
    }
}

마지막으로 다음과 같이 인쇄 작업 자체 앞에 인쇄 작업에 대한 인쇄 작업 수신기 구현을 추가 할 수 있습니다.

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

PrintJobEvent 매개 변수

모든 메소드에는 PrintJobEvent pje 인수가 있습니다. 이 예제에서는 단순화를 위해이 예제를 사용하지 않지만이 예제를 사용하여 상태를 탐색 할 수 있습니다. 예 :

pje.getPrintJob().getAttributes();

PrintJobAttributeSet 객체 인스턴스를 반환하고 for each way에서 실행할 수 있습니다.


동일한 목표를 달성하는 또 다른 방법

동일한 목표를 달성하는 또 다른 옵션은 PrintJobAdapter 클래스를 확장하는 것입니다. 이름에서 알 수 있듯이 PrintJobListener 의 어댑터입니다. 인터페이스를 구현하기 위해서 우리는 강제로 그것들 모두를 구현해야한다. 이 방법의 장점은 우리가 원하는 메서드 만 재정의해야한다는 것입니다. 그것이 어떻게 작동하는지 보자 :

import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobAdapter;

public class LoggerPrintJobAdapter extends PrintJobAdapter {

    // Your favorite Logger class goes here!
    private static final Logger LOG = Logger.getLogger(LoggerPrintJobAdapter.class);

    public void printJobCompleted(PrintJobEvent pje) {
        LOG.info("Print job completed =) ");
    }

    public void printJobFailed(PrintJobEvent pje) {
        LOG.info("Print job failed =( ");
    }
}

일부 특정 메서드 만 재정의합니다.

PrintJobListener 인터페이스를 구현하는 예제와 같은 방식으로 인쇄하기 전에 인쇄 작업에 리스너를 추가합니다.

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow