IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

File d'impression en Java


Sujet :

Développement Web en Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut File d'impression en Java
    Bonjour, après avoir pataugé pas mal pour créer un bout de code permettant d'imprimer en JAVA, j'en viens a un problème qui me bloque : le retour des environnements du processus d'impression, je m'explique.

    Je crée un Thread qui lance plusieurs impressions, avec un listener qui écoute (le spooler ?) me permettant de savoir quand l'impression s'est terminée ou pas. Le problème c'est que les seuls évènements que j'arrive à récupérer depuis ce listener sont le NO_MORE_EVENTS et DATA_TRANSFER_COMPLETE. Impossible par contre de récuperer les events JOB_COMPLETE / JOB_FAILED ou encore JOB_CANCELLED, du coup mon thread reste en wait() indéfiniment.

    Voici mon code (l'impression est lancée dans une boucle for() pour facilité de test )

    La classe d'impression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    package print;
     
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import javax.print.Doc;
    import javax.print.DocFlavor;
    import javax.print.DocPrintJob;
    import javax.print.PrintService;
    import javax.print.PrintServiceLookup;
    import javax.print.SimpleDoc;
     
    public class MyPrintService extends Thread {
     
    	String name;
     
    	public MyPrintService(String name)
    	{
    		super(name);
    		this.name = name;
    		System.out.println("MyPrintService("+this.name+")");
    		this.start();
    	}
     
    	public void print()
    	{
    		System.out.println("print()");
     
    		try {
     
    			for (int i = 1; i < 3; i++) {
     
    				// Open the image file
    				InputStream is			= new BufferedInputStream(new FileInputStream("D://giulio.provasi//Desktop//"+i+".txt"));
    				PrintService service	= PrintServiceLookup.lookupDefaultPrintService();
     
    				// Create the print job
    				DocPrintJob job			= service.createPrintJob();
    				Doc doc					= new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
     
    				// Monitor print job events
    				PrintJobWatcher pjDone	= new PrintJobWatcher();
     
    				job.addPrintJobListener(pjDone);
     
    				// Print it
    				job.print(doc, null);
     
    				// Wait for the print job to be done
    				pjDone.waitForDone();
     
    				// It is now safe to close the input stream
    				is.close();
    			}
    		} catch (Exception e) {
    		}
    	}
     
    	@Override
    	public void run()
    	{
    		System.out.println("run( "+this.name+" )");
    		this.print();
    	}
    }
    Le listener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    package print;
     
    import javax.print.event.PrintJobEvent;
    import javax.print.event.PrintJobListener;
     
    public class PrintJobWatcher implements PrintJobListener {
     
    	Boolean done	= false;
    	Integer status	= 0;
     
    	PrintJobWatcher()
    	{
    		System.out.println("PrintJobWatcher()");
    	}
     
    	@Override
    	public void printDataTransferCompleted(PrintJobEvent pje)
    	{
    		this.done(PrintJobEvent.DATA_TRANSFER_COMPLETE);
    		System.out.println("DATA_TRANSFER_COMPLETE");
    	}
     
    	@Override
    	public void printJobCompleted(PrintJobEvent pje)
    	{
    		this.done(PrintJobEvent.JOB_COMPLETE);
    		System.out.println("JOB_COMPLETE");
    	}
     
    	@Override
    	public void printJobFailed(PrintJobEvent pje)
    	{
    		this.done(PrintJobEvent.JOB_FAILED);
    		System.out.println("JOB_FAILED");
    	}
     
    	@Override
    	public void printJobCanceled(PrintJobEvent pje)
    	{
    		this.done(PrintJobEvent.JOB_CANCELED);
    		System.out.println("JOB_CANCELED");
    	}
     
    	@Override
    	public void printJobNoMoreEvents(PrintJobEvent pje)
    	{
    		this.done(PrintJobEvent.NO_MORE_EVENTS);
    		System.out.println("NO_MORE_EVENTS");
    	}
     
    	@Override
    	public void printJobRequiresAttention(PrintJobEvent pje)
    	{
    		this.done(PrintJobEvent.REQUIRES_ATTENTION);
    		System.out.println("REQUIRES_ATTENTION");
    	}
     
    	private synchronized void done(Integer status)
    	{
    		System.out.println("DONE !");
    		this.status	= status;
    		this.done	= true;
    		notifyAll();
    	}
     
    	synchronized void waitForDone()
    		throws InterruptedException
    	{
    		System.out.println("AVANT : IMPRESSION EN COURS...");
    		try {
                while (!this.done || ((this.status != PrintJobEvent.JOB_COMPLETE) || (this.status != PrintJobEvent.JOB_FAILED))) {
    				System.out.println("IMPRESSION EN COURS...");
                    wait();
                }
            } catch (InterruptedException e) {}
    	}
    }
    Le launcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import print.MyPrintService;
     
     
    public class Main {
     
    	public static void main(String[] args)
    	{
    		System.out.println("C'est parti !");
    		MyPrintService test1 = new MyPrintService("1");
    	}
    }

    Merci d'avance pour tout aide

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    bump ! personne aurait une petite idée?

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    comme indiqué dans la javadoc, no more event est envoyé quand il n'y aura plus d'évènement à venir, cet évènement est obligatoirement délivré si aucun des évènement terminaux (complet/fail/cancel) ne sont délivré, en général à cause d'une limitation du spooler de l'OS. Tu dois donc tester 4 cas et non pas deux dans ton waitfordone.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    humm ok, mais est ce normal de ne jamais recevoir le JOB_COMPLETE / JOB_FAILED ou encore JOB_CANCELLED ? car si je teste mon no_more_events l'appli java termine son exécution bien avant que l'impression de la première page se soit terminée.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui, c'est normal si le spooler en backend ne supporte pas le suivi au niveau de l'api. De plus suivant la mémoire de l'imprimante, même avec du suivi, celle-ci peut très bien diree "c'est fait" alors qu'elle a pas encore mis la première feuille de papier devant les têtes

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    mais du coup comment règle t on le problème de la file d'impressions ? car j'ai essayé d'écouter les quatre évènements principaux, le listener passe bien dans le no_more_jobs mais ca se fait tellement vite que l'imprimante n'accepte jamais mon deuxième job dans la queue.
    A part placer un wait() permettant à l'imprimante de libérer le spooler, je ne vois pas comment on pourrait palier à ce problème.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oO tu devrais pouvoir mettre autant de job que tu veux dans la queue, c'est le principe d'une queue...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Oui bien entendu, je peux mettre autant de job que je veux, le souci c'est l'envoi à l'imprimante, si je les envois tous en même temps il n'y a que le premier qui est imprimé. De même si j'écoute l'évènement no_more_jobs.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    facheux, et si tu fait plusieurs jobs a l'affilée depuis, par exemple, un traitement de texte, elle traite tout ou seulement le premier?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    nah dans le cas où j'envoie les job depuis un logiciel ça passe sans souci ce qui est encore plus étrange ôO

Discussions similaires

  1. Impression sous java
    Par nounowa dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 12/08/2007, 23h57
  2. impression sous java
    Par lauloune dans le forum Langage
    Réponses: 1
    Dernier message: 18/01/2007, 15h49
  3. Pb d'impression en java
    Par souraf dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/06/2006, 15h22
  4. Vider la file d'impression
    Par Thrystan dans le forum Administration système
    Réponses: 2
    Dernier message: 20/01/2004, 19h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo