Domanda

C'è un modo in Java per stampare su una stampante specifica IPP? Tutto il codice di esempio e tutorial che ho trovato concentrarsi su come stampare un particolare tipo di documento, usando qualcosa come il seguente:

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =
             PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
    DocPrintJob pj = pservices[0].createPrintJob();
    try {
        FileInputStream fis = new FileInputStream("test.ps");
        Doc doc = new SimpleDoc(fis, flavor, null);
        pj.print(doc, aset);
    } catch (FileNotFoundException fe) {
    } catch (PrintException e) { 
    }
}

Questo frammento di codice stampa semplicemente alla prima stampante ha rilevato che è in grado di stampare il documento. Nel mio caso, io voglio di ricercare una stampante per la sua URI, ma PrintServiceLookup non sembra a sostegno di questa. Ho provato con un PrintServiceAttributeSet, invece di PrintRequestAttributeSet, e l'aggiunta di un attributo PrinterURI, ma che non restituisce tutte le stampanti. Ho il sospetto che il servizio di ricerca è alla ricerca di una stampante che può cambiare la sua destinazione URI, piuttosto che alla ricerca per la stampante con quella URI.

Come ultima risorsa, ho pensato di appena enumerare attraverso tutti i PrintServices restituiti da lookupPrintServices, ma l'URI non è in nessuna delle attributi. Il nome della stampante è lì, ma ho bisogno l'URI.

Per sfondo, il mio webapp ha la necessità di stampare un codice a barre a una stampante specifica, in base all'utente corrente. Ogni utente è associato a una stampante URI, che punta a una stampante su un server CUPS. La stampante URI è l'unica informazione che ho, e non riesco a limitare il nome della stampante in modo che corrisponda l'URI o una stringa dell'URI.

Modifica Per chiarire un po ', non ho bisogno di rendere i dati, ho solo bisogno di copiare un blob ad una determinata stampante. La parte che non riesco a capire è come identificare una stampante per la sua IPP URI.

È stato utile?

Soluzione

ho finalmente trovato un modo per farlo, utilizzando jipsi:

URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);

Devo ammettere che sono deluso di dover utilizzare una libreria 3rd-party di fare qualcosa in modo apparentemente semplice come la stampa a una stampante specifica.

Aggiorna

DR sottolinea nelle che jipsi ha un nuovo casa , e un nuovo nome.

Cups4J è una bella alternativa, ma come dice il nome potrebbe non funzionare correttamente se la destinazione è non un server CUPS. Ho avuto buoni risultati utilizzando Cups4J per stampare direttamente su una stampante termica Zebra.

Altri suggerimenti

Non credo che si può ottenere una stampante il modo in cui si desidera (penso che il meccanismo di Java Stampa precede IPP).

È possibile, tuttavia, se non ricordo male in grado di rendere il processo di stampa a livello locale e poi spedire i byte del flusso di output per il server CUPS bersaglio "a mano". Questo sarebbe "abbastanza buono" per voi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top