Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    stampare immagini con DocPrintJob

    Salve,

    ho cercato ovunque ma non riesco a trovare una spiegazione o un esempio funzionante di come si deve usare il DocPrintJob per stampare una immagine.

    Ancor meglio, è possibile anche stamparla ad alta qualità ?

    Ciao e grazie
    Ondare, il mio blog!

  2. #2
    Crea un file BasicPrint.java e mettici il codice che trovi qua sotto.
    Compilalo e sii certo che nella cartella corrente ci sia un file chiamato filename.gif.
    Manda in esecuzione e ti stamperà l'immagine
    Se poi vuoi la variante che ti permette di passare da linea di comando l'immagine basta che modifichi di poco il programma.

    Ciao

    Codice PHP:
    import java.io.*;
    import javax.print.*;
    import javax.print.attribute.*;
    import javax.print.attribute.standard.*;
    import javax.print.event.*;

    public class 
    BasicPrint {
        public static 
    void main(String[] args) {
            try {
                
    // Apre l'immagine
                
    InputStream is = new BufferedInputStream(
                    new 
    FileInputStream("filename.gif"));

                
    // Cerca la stampante predefinita
                
    DocFlavor flavor DocFlavor.INPUT_STREAM.GIF;
                
    PrintService service PrintServiceLookup.lookupDefaultPrintService();

                
    // Crea un processo di stampa
                
    DocPrintJob job service.createPrintJob();
                
    Doc doc = new SimpleDoc(isflavornull);

                
    // Monitora i processi di stampa
                
    PrintJobWatcher pjDone = new PrintJobWatcher(job);

                
    // Stampa
                
    job.print(docnull);

                
    // Aspetta che la stampa sia finita
                
    pjDone.waitForDone();

                
    // Chiude input stream
                
    is.close();
            } catch (
    PrintException e) {
            } catch (
    IOException e) {
            }
        }
    }

    // Classe interna per il monitoraggio dei processi di stampa

    class PrintJobWatcher {
        
    // E' vero nel caso in cui risulti sicuro chiudere l'input stream dei processi di stampa
        
    boolean done false;

        
    PrintJobWatcher(DocPrintJob job) {
            
    // Aggiunge un listener al processo di stampa
            
    job.addPrintJobListener(new PrintJobAdapter() {
                public 
    void printJobCanceled(PrintJobEvent pje) {
                    
    allDone();
                }
                public 
    void printJobCompleted(PrintJobEvent pje) {
                    
    allDone();
                }
                public 
    void printJobFailed(PrintJobEvent pje) {
                    
    allDone();
                }
                public 
    void printJobNoMoreEvents(PrintJobEvent pje) {
                    
    allDone();
                }
                
    void allDone() {
                    
    synchronized (PrintJobWatcher.this) {
                        
    done true;
                        
    PrintJobWatcher.this.notify();
                    }
                }
            });
        }
        public 
    synchronized void waitForDone() {
            try {
                while (!
    done) {
                    
    wait();
                }
            } catch (
    InterruptedException e) {
            }
        }

    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  3. #3
    grazie, avevo trovato anche io questa soluzione.. in effetti funziona bene

    tra l'altro per completezza per chi volesse stampare multidoc deve prima utilizzare il metodo lookup relativo e poi dopo essersi creato una classe che implementi MultiDoc utilizzare il MultidocPrintService per la stampa.

    aggiungo che il metodo printJobCompleted non sempre viene richiamato da tutte le stampanti a volte si genera solo il printJobNoMoreEvents come fine stampa, prestate attenzione.

    codice:
                DocPrintJob prnJob = service.createPrintJob();
                if (pjl != null) prnJob.addPrintJobListener(pjl);
                PrintJobWatcher pjDone = new PrintJobWatcher(prnJob);
                
                if (prnJob instanceof MultiDocPrintJob)
                   ((MultiDocPrintJob)prnJob).print(mdoc, pras);
                //Thread.sleep(5000);
                pjDone.waitForDone();
                
                // isHash .. hashtable di inputstream nel caso si stampi accedendo dagli stream
                Enumeration isEnu = isHash.elements();
                while (isEnu.hasMoreElements())
                   ((InputStream)isEnu.nextElement()).close();
    l'oggetto mdoc in realtà è una istanza della classe myMultiDoc, ad esempio come questa che segue..

    codice:
    class myMultiDoc extends Vector implements MultiDoc {
    
    public myMultiDoc() { currentDoc = 0; }
    
    public Doc getDoc() { return (Doc) elementAt(currentDoc); }
    public MultiDoc next() { return (MultiDoc) elementAt(++currentDoc); }
    
    int currentDoc;
    }
    per prendere la stampante di default si può usare

    codice:
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    questa però può anche essere di tipo MultiDocPrintService.

    Per quanto riguarda recuperare le liste delle stampanti a disposizione usare i metodi lookup

    codice:
    MultiDocPrintService[] ps1 = PrintServiceLookup.lookupMultiDocPrintServices(null, null);
    
    PrintService[] ps = PrinterJob.lookupPrintServices();

    il codice per la stampa del documento singolo invece è come quello fornito da matthew80, che ringrazio

    Ciao
    Ondare, il mio blog!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.