2012-06-27 151 views
5

Usando Java, necesito imprimir en la impresora de red, que no está instalada localmente. Solo sé el nombre de la impresora. Todos los tutoriales que he visto comenzaron con algo como:¿Cómo usar Java para imprimir en una impresora de red?

PrintService []services = PrinterJob.lookupPrintServices();

El problema es que no puede haber ninguna impresora instalada, por lo que los servicios estarán vacíos en ese caso. Necesito establecer el nombre de la impresora directamente, no solo enumerar a través de impresoras visibles.

+0

Las impresoras disponibles a través de 'lookupPrintServices()' listan las impresoras registradas en el O/S y registradas para el usuario que ejecuta la aplicación. Por ejemplo, si está en Windows, debe asegurarse de que la Impresora que desea esté registrada como el usuario del directorio activo en el que se ejecuta la aplicación (usuario local, servicio registrado, etc.). Este es un registro único. En una red, también puede registrar una impresora en la red y acceder a ella // server/printername – JoshDM

+0

No necesito usar lookupPrintServices(). Tengo los nombres de las impresoras en el formato // server/printername. El problema es que lookupPrintServices no puede ver ninguno de ellos y no puedo registrarlo ni instalarlo. En .NET puede simplemente configurar el nombre de la impresora en la configuración de la impresora del objeto. Quiero saber si existe alguna posibilidad similar en Java también. Es sencillo. Tengo el archivo pdf (que maneja PDFBox) y el nombre de la impresora y quiero imprimirlo en silencio sin abrir Acrobat. Quiero saber la manera más simple. – user1431544

+1

Incluso si está registrado en la red, si la impresora no está visible en el panel de control de Windows para el usuario del dominio que ejecuta la aplicación java, no será visible para Java a través de la API awt print. Puede tener el nombre y la ruta correcta, pero si no está registrado en el servidor en el que se está ejecutando la aplicación, no se encontrará. – JoshDM

Respuesta

8

Java AWT Printing no encontrará una impresora a través de una ruta de acceso si no está registrada en el usuario de Windows/Active Directory que ejecuta la aplicación de impresión. Debe registrar la ruta de la impresora a través de "Dispositivos e impresoras" de Windows como una impresora para que el usuario esté visible. Luego debe ejecutar lookupPrintServices para ver la lista de impresoras disponibles y recuperar la correcta PrintService con el nombre exacto String en la lista.

/** 
* Retrieve the specified Print Service; will return null if not found. 
* @return 
*/ 
public static PrintService findPrintService(String printerName) { 

    PrintService service = null; 

    // Get array of all print services - sort order NOT GUARANTEED! 
    PrintService[] services = PrinterJob.lookupPrintServices(); 

    // Retrieve specified print service from the array 
    for (int index = 0; service == null && index < services.length; index++) { 

     if (services[index].getName().equalsIgnoreCase(printerName)) { 

      service = services[index]; 
     } 
    } 

    // Return the print service 
    return service; 
} 

/** 
* Retrieve a PrinterJob instance set with the PrinterService using the printerName. 
* 
* @return 
* @throws Exception IllegalStateException if expected printer is not found. 
*/ 
public static PrinterJob findPrinterJob(String printerName) throws Exception { 

    // Retrieve the Printer Service 
    PrintService printService = PrintUtility.findPrintService(printerName); 

    // Validate the Printer Service 
    if (printService == null) { 

     throw new IllegalStateException("Unrecognized Printer Service \"" + printerName + '"'); 
    } 

    // Obtain a Printer Job instance. 
    PrinterJob printerJob = PrinterJob.getPrinterJob(); 

    // Set the Print Service. 
    printerJob.setPrintService(printService); 

    // Return Print Job 
    return printerJob; 
} 

/** 
* Printer list does not necessarily refresh if you change the list of 
* printers within the O/S; you can run this to refresh if necessary. 
*/ 
public static void refreshSystemPrinterList() { 

    Class[] classes = PrintServiceLookup.class.getDeclaredClasses(); 

    for (int i = 0; i < classes.length; i++) { 

     if ("javax.print.PrintServiceLookup$Services".equals(classes[i].getName())) { 

      sun.awt.AppContext.getAppContext().remove(classes[i]); 
      break; 
     } 
    } 
} 
+0

¿Está intentando decirme que no hay forma de imprimir en una impresora no registrada? Eso es genial. Gracias. – user1431544

+0

¿Por qué no puede registrar la impresora de red en el servidor donde se ejecuta la aplicación? Es una tarea de una sola vez. – JoshDM

+0

Honestamente, no sé. Es la red de clientes y él tiene algún motivo para ello. Sé que apesta, pero registrar impresoras no es una opción. – user1431544

0

En mi caso no fue un error de autenticación, no pude encontrar la impresora compartida porque los registraron con la cuenta Usuario local, usando otra cuenta o cambiar la impresora subvenciones pude encontrarlo.

Cuestiones relacionadas