2011-08-24 13 views
8

Tengo un archivo que funciona bien si uso el comando lp filename.Impresión mediante tazas con javax.print

El archivo es un archivo ESC/P para una impresora de impacto de recibos. Eso tiene drivers linux CUPS nativos y todo lo que funciona.

Estoy tratando de usar la API javax.print para que pueda tener un control más detallado sobre la impresión y, con suerte, mantenerla compatible con plataformas cruzadas, aunque Linux es la plataforma de destino.

que he probado todas las combinaciones DocFlavor conocida por el hombre y cada tipo de tipo de datos (InputStream, byte[], Reader etc.)

O bien simplemente ignora el comando print() todos juntos o simplemente se da vuelta una hoja en blanco papel. Ejecutando lp filename lo imprime perfecto, entonces ¿cómo obtengo javax.print para hacer el equivalente funcional de lp filename?

No tengo activado el uso de javax.print Puedo usar otras "cosas" y podría comenzar a investigar cups4J pero parece que me limitaría a Linux/* nix solamente, lo cual está bien por ahora, pero preferiría tener una plataforma cruzada solución.

Podría simplemente emitir el comando del sistema lp en el archivo, pero, necesito un control más fino. Estos no son recibos que estamos imprimiendo, son boletos y los boletos van de $ 5.00 a miles de dólares. Actualmente, si detectamos un problema de impresión, anulamos la transacción y, si hay algo impreso, no es válido, no tomamos las reimpresiones a la ligera y la mayoría del tiempo cargamos para imprimir una nueva copia si el cliente pierde su copia. Oh, la razón para hacer esto es que estamos cambiando el sistema POS de Windows a Linux y las impresoras de acceso directo a través de puertos seriales a CUPS administradas a través de USB. Aquí está mi código que no funciona. Cualquier ayuda es apreciada.

try { 
    // Find the default service 
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 

    PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

    // Create the print job 
    DocPrintJob job = service.createPrintJob(); 
    InputStream in = new FileInputStream("/home/bart/real.escp"); 
    Doc docNew = new SimpleDoc(in,flavor,null); 

    // Monitor print job events; for the implementation of PrintJobWatcher, 
    // see Determining When a Print Job Has Finished 
    PrintJobWatcher pjDone = new PrintJobWatcher(job); 

    // Print it 
    job.print(docNew, null); 

    // Wait for the print job to be done 
    pjDone.waitForDone(); 

    // It is now safe to close the input stream 
    in.close(); 
} catch (PrintException e) { 
} catch (IOException e) { 
} 
+1

Impresión de Java en Linux es arriesgado en el mejor. Llevé a los bombardeos a la línea de comando con un comando lpr para hacer parte de mi impresión. Una opción podría ser ver si puede convertir su archivo a un formato que Java entienda, como PDF y luego usar javax.print en él. – Mitch

+0

Ese es el problema de que puede haber un convertidor linux esc/p, pero ¿por qué preocuparse cuando el comando lp se imprime bien ?, parece pedir problemas para pasar de ESC/P (que se puede alimentar directamente a la impresora) -> PDF (para hacer Java Happy) -> ESC/P (a través del controlador). Estamos generando los archivos ESC/P. De todos modos funciona muy bien con Cups4J, tomó alrededor de 15 minutos en implementarse. Supongo que usaré cups4J y trataré con cualquier otro sistema operativo/sistema de impresión cuando aparezcan. –

Respuesta

0

Estoy bien con cups4j. Primero obtenga su impresora.

try { 
     CupsClient client = new CupsClient("addressOfTheCupsServer", 631); 
     List<CupsPrinter> printers = client.getPrinters(); 
     if (printers.size() == 0) { 
      throw new RuntimeException("Cant list Printer"); 
     } 
     for (CupsPrinter cupsPrinter : printers) { 
      if (cupsPrinter.getName().equals("NameOfPrinter")) { 
       selectedPrinter = cupsPrinter; 
      } 
     } 
    }catch (Exception ignored){ 
     ignored.printStackTrace(); 
    } 
} 

continuación, crear un trabajo de impresión y enviarlo a la impresora

PrintJob printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build(); 
    PrintRequestResult result = selectedPrinter.print(printJob); 
Cuestiones relacionadas