Moyen 10 questions

QCM Java - API Print Service et Impression de Documents (Partie 6)

Quiz interactif sur l'API Java Print Service : creation de documents, decouverte des services d'impression, attributs et ecouteurs d'evenements.

#java #print-service #pdf-generated

Comment jouer ?

  • 1. Lisez chaque question attentivement
  • 2. Choisissez votre réponse parmi les options
  • 3. Cliquez sur "Voir la réponse" pour vérifier
  • 4. Comptez vos bonnes réponses à la fin !

Quiz: QCM Java - API Print Service et Impression de Documents (Partie 6)

10 questions | Difficulte: moyen


Question 1

Quelle classe est utilisee pour creer un document simple a imprimer en Java ?

  • A. PrintDocument
  • B. SimpleDoc
  • C. DocPrint
  • D. PrintableDoc
Voir la reponse

Reponse correcte: B

La classe SimpleDoc est l’implementation par defaut de l’interface Doc fournie par l’API Java Print Service. Elle permet de creer facilement un document a partir d’un flux de donnees et d’un type de document (DocFlavor).

Pourquoi les autres reponses sont incorrectes :

  • A. PrintDocument : Cette classe n’existe pas dans l’API Java Print Service standard.
  • C. DocPrint : Ce n’est pas un nom de classe valide dans javax.print.
  • D. PrintableDoc : Cette classe n’existe pas. Attention a ne pas confondre avec l’interface Printable de java.awt.print.

Exemple de code :

import javax.print.Doc;
import javax.print.SimpleDoc;
import javax.print.DocFlavor;
import java.io.FileInputStream;

FileInputStream pdfFileInputStream = new FileInputStream("document.pdf");
DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;
Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor, null);

Question 2

Quelle classe permet de decouvrir les services d’impression disponibles sur le systeme ?

  • A. PrinterDiscovery
  • B. PrintServiceLookup
  • C. PrinterFinder
  • D. ServiceLocator
Voir la reponse

Reponse correcte: B

PrintServiceLookup est la classe utilitaire qui permet de rechercher et decouvrir les services d’impression installes sur le systeme. Elle fournit des methodes statiques comme lookupPrintServices() pour obtenir la liste de tous les services d’impression disponibles.

Pourquoi les autres reponses sont incorrectes :

  • A. PrinterDiscovery : Nom invente qui n’existe pas dans l’API.
  • C. PrinterFinder : Cette classe n’existe pas dans javax.print.
  • D. ServiceLocator : C’est un pattern de conception, pas une classe de l’API Print Service.

Exemple de code :

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

// Obtenir tous les services d'impression
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
for (PrintService service : services) {
    System.out.println("Imprimante: " + service.getName());
}

// Obtenir le service d'impression par defaut
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();

Question 3

Quelle classe est utilisee pour definir un ensemble d’attributs de demande d’impression ?

  • A. PrintRequestAttributes
  • B. AttributeSet
  • C. HashPrintRequestAttributeSet
  • D. PrinterAttributes
Voir la reponse

Reponse correcte: C

HashPrintRequestAttributeSet est l’implementation concrete de l’interface PrintRequestAttributeSet. Elle utilise une table de hachage pour stocker les attributs de demande d’impression comme le nombre de copies, le format de papier, l’orientation, etc.

Pourquoi les autres reponses sont incorrectes :

  • A. PrintRequestAttributes : C’est une interface, pas une classe d’implementation.
  • B. AttributeSet : C’est l’interface de base pour tous les ensembles d’attributs, trop generique pour les demandes d’impression.
  • D. PrinterAttributes : Cette classe n’existe pas sous ce nom.

Exemple de code :

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.*;

PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(new Copies(5));                    // 5 copies
attributes.add(MediaSizeName.ISO_A4);             // Format A4
attributes.add(OrientationRequested.PORTRAIT);   // Orientation portrait
attributes.add(PrintQuality.HIGH);               // Haute qualite

Question 4

Quelle interface doit etre implementee pour ecouter les changements d’etat d’une tache d’impression ?

  • A. PrintJobObserver
  • B. PrintJobListener
  • C. PrintEventHandler
  • D. JobStateListener
Voir la reponse

Reponse correcte: B

PrintJobListener est l’interface standard de l’API Java Print Service pour recevoir des notifications sur les evenements lies a une tache d’impression. Elle definit des methodes comme printDataTransferCompleted(), printJobCompleted(), printJobFailed(), etc.

Pourquoi les autres reponses sont incorrectes :

  • A. PrintJobObserver : Pattern Observer, mais pas le nom correct de l’interface.
  • C. PrintEventHandler : Cette interface n’existe pas dans javax.print.event.
  • D. JobStateListener : Nom incorrect qui ne fait pas partie de l’API.

Exemple de code :

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

public class MonPrintJobListener implements PrintJobListener {
    @Override
    public void printDataTransferCompleted(PrintJobEvent pje) {
        System.out.println("Transfert des donnees termine");
    }

    @Override
    public void printJobCompleted(PrintJobEvent pje) {
        System.out.println("Impression terminee avec succes");
    }

    @Override
    public void printJobFailed(PrintJobEvent pje) {
        System.out.println("Echec de l'impression");
    }

    // Autres methodes: printJobCanceled, printJobNoMoreEvents, printJobRequiresAttention
}

Question 5

Quel objet represente le type MIME et la classe de representation d’un document a imprimer ?

  • A. MimeType
  • B. DocFlavor
  • C. DocumentType
  • D. ContentType
Voir la reponse

Reponse correcte: B

DocFlavor est une classe qui encapsule deux informations essentielles : le type MIME du document (comme “application/pdf” ou “text/plain”) et la classe Java utilisee pour representer les donnees (comme InputStream ou byte[]). Cette combinaison permet au service d’impression de savoir comment traiter le document.

Pourquoi les autres reponses sont incorrectes :

  • A. MimeType : Existe dans javax.activation mais ne fait pas partie de l’API Print Service.
  • C. DocumentType : Cette classe n’existe pas dans l’API.
  • D. ContentType : Utilisee dans d’autres contextes (HTTP), pas pour l’impression.

Exemple de code :

import javax.print.DocFlavor;

// Pour un PDF via InputStream
DocFlavor pdfFlavor = DocFlavor.INPUT_STREAM.PDF;

// Pour du texte via String
DocFlavor textFlavor = DocFlavor.STRING.TEXT_PLAIN;

// Pour une image JPEG via byte array
DocFlavor jpegFlavor = DocFlavor.BYTE_ARRAY.JPEG;

// Verifier si un service supporte un DocFlavor
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
boolean supporte = service.isDocFlavorSupported(pdfFlavor);

Question 6

Quelle methode de PrintServiceLookup permet d’obtenir l’imprimante par defaut du systeme ?

  • A. getDefaultPrinter()
  • B. lookupDefaultPrintService()
  • C. getSystemPrinter()
  • D. findDefaultService()
Voir la reponse

Reponse correcte: B

lookupDefaultPrintService() est la methode statique de PrintServiceLookup qui retourne le service d’impression par defaut configure sur le systeme. Elle peut retourner null si aucun service d’impression par defaut n’est configure.

Pourquoi les autres reponses sont incorrectes :

  • A. getDefaultPrinter() : Nom intuitif mais incorrect - Java utilise “Service” et non “Printer”.
  • C. getSystemPrinter() : Cette methode n’existe pas.
  • D. findDefaultService() : Nom similaire au pattern mais pas la vraie methode.

Exemple de code :

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

PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();

if (defaultService != null) {
    System.out.println("Imprimante par defaut: " + defaultService.getName());

    // Verifier les attributs supportes
    Class<?>[] supportedCategories = defaultService.getSupportedAttributeCategories();
    for (Class<?> category : supportedCategories) {
        System.out.println("Categorie supportee: " + category.getSimpleName());
    }
} else {
    System.out.println("Aucune imprimante par defaut configuree");
}

Question 7

Quel attribut permet de specifier le nombre de copies a imprimer ?

  • A. NumberOfCopies
  • B. CopyCount
  • C. Copies
  • D. PrintCopies
Voir la reponse

Reponse correcte: C

Copies est la classe d’attribut standard (dans javax.print.attribute.standard) qui permet de specifier le nombre de copies d’un document a imprimer. Elle implemente l’interface PrintRequestAttribute et herite de IntegerSyntax.

Pourquoi les autres reponses sont incorrectes :

  • A. NumberOfCopies : Nom logique mais pas celui utilise par l’API Java.
  • B. CopyCount : Cette classe n’existe pas.
  • D. PrintCopies : Nom incorrect.

Exemple de code :

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;

HashPrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();

// Imprimer 3 copies
attrs.add(new Copies(3));

// Obtenir le nombre de copies d'un ensemble d'attributs
Copies copies = (Copies) attrs.get(Copies.class);
if (copies != null) {
    int nombreCopies = copies.getValue();
    System.out.println("Nombre de copies: " + nombreCopies);
}

Question 8

Quelle methode de DocPrintJob permet de lancer l’impression d’un document ?

  • A. startPrint()
  • B. print()
  • C. execute()
  • D. submit()
Voir la reponse

Reponse correcte: B

La methode print(Doc doc, PrintRequestAttributeSet attributes) de l’interface DocPrintJob est utilisee pour soumettre un document a l’impression. Elle prend en parametres le document a imprimer et les attributs de demande d’impression.

Pourquoi les autres reponses sont incorrectes :

  • A. startPrint() : Cette methode n’existe pas dans DocPrintJob.
  • C. execute() : Nom generique utilise dans d’autres contextes (Runnable, ExecutorService) mais pas ici.
  • D. submit() : Utilise pour les taches asynchrones (Future), pas pour l’impression.

Exemple de code :

import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import java.io.FileInputStream;

// Obtenir le service d'impression
PrintService service = PrintServiceLookup.lookupDefaultPrintService();

// Creer le document
FileInputStream fis = new FileInputStream("rapport.pdf");
Doc doc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.PDF, null);

// Creer les attributs
HashPrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();

// Creer et lancer la tache d'impression
DocPrintJob job = service.createPrintJob();
try {
    job.print(doc, attrs);  // Lancer l'impression
} catch (PrintException e) {
    System.err.println("Erreur d'impression: " + e.getMessage());
}

Question 9

Quelle classe d’exception est levee en cas d’erreur lors de l’impression ?

  • A. PrinterException
  • B. PrintException
  • C. PrintingException
  • D. PrintJobException
Voir la reponse

Reponse correcte: B

PrintException est l’exception specifique de l’API Java Print Service qui est levee lorsqu’une erreur survient pendant le processus d’impression. Elle peut avoir plusieurs sous-classes plus specifiques comme PrinterAbortException ou PrinterIOException.

Pourquoi les autres reponses sont incorrectes :

  • A. PrinterException : Existe dans java.awt.print, mais c’est l’ancienne API d’impression, pas javax.print.
  • C. PrintingException : Cette classe n’existe pas.
  • D. PrintJobException : Ce n’est pas le nom correct de l’exception.

Exemple de code :

import javax.print.*;

try {
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    if (service == null) {
        throw new PrintException("Aucun service d'impression disponible");
    }

    DocPrintJob job = service.createPrintJob();
    job.print(doc, attributes);

} catch (PrintException e) {
    // Gerer l'erreur d'impression
    System.err.println("Erreur d'impression: " + e.getMessage());

    // Verifier les causes possibles
    Throwable cause = e.getCause();
    if (cause != null) {
        System.err.println("Cause: " + cause.getMessage());
    }
}

Question 10

Quel evenement est declenche lorsque toutes les donnees ont ete transferees vers le service d’impression ?

  • A. printJobCompleted
  • B. printDataTransferCompleted
  • C. dataTransferFinished
  • D. printJobReady
Voir la reponse

Reponse correcte: B

L’evenement printDataTransferCompleted est declenche par le PrintJobListener lorsque toutes les donnees du document ont ete transferees avec succes vers le service d’impression. Attention : cela ne signifie pas que l’impression est terminee, seulement que les donnees ont ete envoyees.

Pourquoi les autres reponses sont incorrectes :

  • A. printJobCompleted : Cet evenement est declenche lorsque l’impression est physiquement terminee, pas juste le transfert de donnees.
  • C. dataTransferFinished : Ce n’est pas le nom correct de la methode dans l’API.
  • D. printJobReady : Cet evenement n’existe pas dans PrintJobListener.

Exemple de code :

import javax.print.event.*;

public class PrintJobMonitor implements PrintJobListener {

    @Override
    public void printDataTransferCompleted(PrintJobEvent pje) {
        // Donnees transferees - l'impression peut prendre plus de temps
        System.out.println("Donnees envoyees a l'imprimante");
    }

    @Override
    public void printJobCompleted(PrintJobEvent pje) {
        // Impression physiquement terminee
        System.out.println("Impression terminee avec succes!");
    }

    @Override
    public void printJobFailed(PrintJobEvent pje) {
        System.out.println("L'impression a echoue");
    }

    @Override
    public void printJobCanceled(PrintJobEvent pje) {
        System.out.println("Impression annulee");
    }

    @Override
    public void printJobNoMoreEvents(PrintJobEvent pje) {
        System.out.println("Plus d'evenements a venir");
    }

    @Override
    public void printJobRequiresAttention(PrintJobEvent pje) {
        System.out.println("Attention requise (papier, encre, etc.)");
    }
}

Pour aller plus loin

Voici quelques ressources pour approfondir vos connaissances sur l’API Java Print Service :

  1. Documentation Oracle officielle : Java Print Service API - La reference complete pour toutes les classes et interfaces de l’API.

  2. Tutorial Oracle Java Printing : Le guide officiel qui couvre les concepts fondamentaux de l’impression en Java, incluant l’ancienne API java.awt.print et la nouvelle API javax.print.

  3. Baeldung - Guide to Java Print API : Un tutoriel pratique avec des exemples de code complets pour differents scenarios d’impression (PDF, images, texte).


Ce QCM fait partie d’une serie d’exercices sur Java. Consultez les autres parties pour approfondir vos connaissances.