Pregunta

¿Hay alguna manera en Java para imprimir en una impresora específica del IPP? Todo el código de ejemplo y tutoriales que he encontrado enfoque sobre cómo imprimir un determinado tipo de documento, usando algo como lo siguiente:

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) { 
    }
}

Este fragmento simplemente imprime a la primera impresora encontró que es capaz de imprimir el documento. En mi caso, quiero para buscar una impresora por su URI, pero PrintServiceLookup no parece apoyar esto. He intentado usar un PrintServiceAttributeSet, en lugar de PrintRequestAttributeSet, y añadiendo un atributo PrinterURI, pero que no devuelve ningún impresoras. Sospecho que el servicio de búsqueda está buscando una impresora que puede cambiar su destino URI, en lugar de buscar la impresora con ese URI.

Como último recurso, pensé simplemente enumerar a través de todos los PrintServices devueltos por lookupPrintServices, pero el URI no se encuentra en ninguno de los atributos. El nombre de la impresora está ahí, pero necesito el URI.

En el fondo, mi aplicación web tiene que imprimir un código de barras en una impresora específica, basado en el usuario actual. Cada usuario está asociado con una impresora URI, que apunta a una impresora en un servidor CUPS. El URI de la impresora es la única información que tengo, y no puede restringir el nombre de la impresora para que coincida con el URI o una subcadena de la URI.

Editar Para aclarar un poco, no necesito para representar los datos, sólo hay que copiar una mancha en una impresora determinada. La parte que no puedo entender es cómo identificar una impresora IPP por su URI.

¿Fue útil?

Solución

Finalmente encontré una manera de hacer esto, mediante el uso de 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);

Tengo que admitir que estoy decepcionado por tener que utilizar una biblioteca tercera proveedores para hacer algo tan aparentemente simple como imprimir en una impresora específica.

Actualizar

DR señala en los comentarios que jipsi tiene un nuevo , y un nuevo nombre.

Cups4J es una buena alternativa, pero como el nombre implica que puede no funcionar correctamente si el destino es no un servidor CUPS. He tenido buenos resultados usando Cups4J para imprimir directamente en una impresora térmica Zebra.

Otros consejos

No creo que se puede conseguir una impresora de la manera que le gustaría (creo que el mecanismo de impresión de Java anterior IPP).

Usted puede, sin embargo, si no recuerdo mal ser capaz de hacer que el trabajo de impresión a nivel local y luego enviar los bytes de la corriente de salida al servidor CUPS objetivo "a mano". ¿Esto sería "lo suficientemente bueno" para usted?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top