Recherche…


Introduction

L' API Java Print Service fournit des fonctionnalités permettant de découvrir les services d'impression et d'envoyer des demandes d'impression pour ces services.

Il inclut des attributs d'impression extensibles basés sur les attributs standard spécifiés dans le protocole IPP (Internet Printing Protocol) 1.1 de la spécification IETF, RFC 2911 .

Découvrir les services d'impression disponibles

Pour découvrir tous les services d'impression disponibles, nous pouvons utiliser la classe PrintServiceLookup . Voyons comment:

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());
        }
    }

}

Ce programme, lorsqu'il est exécuté dans un environnement Windows, imprimera quelque chose comme ceci:

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

Découverte du service d'impression par défaut

Pour découvrir le service d'impression par défaut, nous pouvons utiliser la classe PrintServiceLookup . Voyons comment ::

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());
    }

}

Création d'un travail d'impression à partir d'un service d'impression

Un travail d'impression est une demande d'impression d'un élément dans un service d'impression spécifique. Il consiste essentiellement en:

Après avoir sélectionné l'instance de service d'impression appropriée, nous pouvons demander la création d'un travail d'impression:

DocPrintJob printJob = printService.createPrintJob();

L'interface DocPrintJob nous fournit la méthode d' print :

printJob.print(doc, pras);

L'argument doc est un Doc : les données qui seront imprimées.

Et l'argument pras est une interface PrintRequestAttributeSet : un ensemble de PrintRequestAttribute . Sont des exemples d'attributs de demande d'impression:

  • quantité de copies (1, 2, etc.),
  • orientation (portrait ou paysage)
  • chromacité (monochrome, couleur)
  • qualité (brouillon, normal, élevé)
  • côtés (recto, recto verso, etc.)
  • etc...

La méthode print peut lancer une PrintException .

Construire le Doc qui sera imprimé

Doc est une interface et l'API Java Print Service fournit une implémentation simple appelée SimpleDoc .

Chaque instance de Doc est essentiellement composée de deux aspects:

  • le contenu des données d'impression lui-même (un courrier électronique, une image, un document, etc.)
  • le format de données d'impression, appelé DocFlavor (type MIME + classe de représentation).

Avant de créer l'objet Doc , nous devons charger notre document à partir de quelque part. Dans l'exemple, nous allons charger un fichier spécifique à partir du disque:

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

Alors maintenant, nous devons choisir un DocFlavor qui correspond à notre contenu. La classe DocFlavor a un tas de constantes pour représenter les types de données les plus courants. Prenons un INPUT_STREAM.PDF :

DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;

Maintenant, nous pouvons créer une nouvelle instance de SimpleDoc :

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

L'objet doc peut maintenant être envoyé à la demande de travail d'impression (voir Création d'un travail d'impression à partir d'un service d'impression ).

Définition d'attributs de demande d'impression

Parfois, nous devons déterminer certains aspects de la demande d'impression. Nous les appellerons attribut .

Sont des exemples d'attributs de demande d'impression:

  • quantité de copies (1, 2, etc.),
  • orientation (portrait ou paysage)
  • chromacité (monochrome, couleur)
  • qualité (brouillon, normal, élevé)
  • côtés (recto, recto verso, etc.)
  • etc...

Avant de choisir l'un d'eux et la valeur que chacun aura, nous devons d'abord créer un ensemble d'attributs:

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

Maintenant, nous pouvons les ajouter. Certains exemples sont:

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

L'objet pras peut maintenant être envoyé à la demande de travail d'impression (voir Création d'un travail d'impression à partir d'un service d'impression ).

Modification du statut de demande d'impression d'un travail d'écoute

Pour les clients d'impression les plus nombreux, il est extrêmement utile de savoir si un travail d'impression est terminé ou a échoué.

L'API Java Print Service fournit des fonctionnalités pour s'informer sur ces scénarios. Tout ce que nous avons à faire est:

  • fournir une implémentation pour l'interface PrintJobListener et
  • enregistrer cette implémentation sur le travail d'impression.

Lorsque l'état du travail d'impression change, nous en serons informés. Nous pouvons faire tout ce qui est nécessaire, par exemple:

  • mettre à jour une interface utilisateur,
  • lancer un autre processus métier,
  • enregistrer quelque chose dans la base de données,
  • ou simplement le connecter.

Dans l'exemple ci-dessous, nous enregistrerons chaque changement d'état de travail d'impression:

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 ");
    }
}

Enfin, nous pouvons ajouter l'implémentation de l'auditeur de travaux d'impression sur le travail d'impression avant la demande d'impression elle-même, comme suit:

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

L'argument PrintJobEvent pje

Notez que chaque méthode a un argument PrintJobEvent pje . Nous ne l'utilisons pas dans cet exemple à des fins de simplicité, mais vous pouvez l'utiliser pour explorer le statut. Par exemple:

pje.getPrintJob().getAttributes();

Renvoie une instance d'objet PrintJobAttributeSet et vous pouvez les exécuter d'une manière pour-chaque.


Une autre façon d'atteindre le même objectif

Une autre option pour atteindre le même objectif est d'étendre la classe PrintJobAdapter , comme son nom l'indique, est un adaptateur pour PrintJobListener . En mettant en œuvre l'interface, nous devons obligatoirement les implémenter tous. L'avantage de cette façon, c'est que nous devons remplacer uniquement les méthodes que nous voulons. Voyons voir comment ça fonctionne:

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 =( ");
    }
}

Notez que nous ne remplaçons que certaines méthodes spécifiques.

De la même manière que dans l'exemple implémentant l'interface PrintJobListener , nous ajoutons l'écouteur au travail d'impression avant de l'envoyer à l'impression:

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow