2010-11-14 10 views
9

¿Hay alguna manera de forzar la impresora de destino en Java, utilizando HashPrintRequestAttributeSet?Fuerza la impresora de destino en Java

no quiero que el usuario sea capaz de cambiar la impresora en los PrintDialog

Gracias

+0

Por qué ........... –

+0

Ningún usuario ....? ... – Phil

Respuesta

11

Tuvo que resolver esto de la manera difícil, pero para las generaciones futuras, aquí está un poco de mi código:

PrintService[] printServices; 
PrintService printService; 
PageFormat pageFormat; 

String printerName = "Your printer name in Devices and Printers"; 

PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet(); 
printServiceAttributeSet.add(new PrinterName(printerName, null)); 
printServices = PrintServiceLookup.lookupPrintServices(null, printServiceAttributeSet); 

pageFormat = new PageFormat(); // If you want to adjust heigh and width etc. of your paper. 
pageFormat = printerjob.defaultPage(); 

PrinterJob printerjob = PrinterJob.getPrinterJob(); 

printerjob.setPrintable(new Server(), pageFormat); // Server was my class's name, you use yours. 

try { 
    printService = printServices[0]; 
    printerjob.setPrintService(printService); // Try setting the printer you want 
} catch (ArrayIndexOutOfBoundsException e) { 
    System.err.println("Error: No printer named '" + printerName + "', using default printer."); 
    pageFormat = printerjob.defaultPage(); // Set the default printer instead. 
} catch (PrinterException exception) { 
    System.err.println("Printing error: " + exception); 
} 

try { 
    printerjob.print(); // Actual print command 
} catch (PrinterException exception) { 
    System.err.println("Printing error: " + exception); 
} 
7

Mi código para resolver esto:

String printerNameDesired = "My Printer"; 

PrintService[] service = PrinterJob.lookupPrintServices(); // list of printers 

int count = service.length; 

for (int i = 0; i < count; i++) { 
    if (service[i].getName().equalsIgnoreCase(printerNameDesired)) { 
     docPrintJob = service[i].createPrintJob(); 
     i = count; 
    } 
} 
PrinterJob pjob = PrinterJob.getPrinterJob(); 
pjob.setPrintService(docPrintJob.getPrintService()); 
pjob.setJobName("job"); 
pjob.print(); 
+2

Este me funcionó, solo que olvidó inicializar el docPrintJob. Sugiero agregar el siguiente código para que sea completamente funcional: 'DocPrintJob docPrintJob = null;' después de 'PrintService [] service = PrinterJob.lookupPrintServices();'. – bashoogzaad

+0

Actualizado aquí: http://stackoverflow.com/q/35535589/285594 – YumYumYum

0

Acabo de resolver este problema mediante la ejecución comando cmd en Java

static void changeWindowsDefaultPrinter(String printerName) { 
    String cmdLine = String.format("RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n \"%s\"", printerName); 
    ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", cmdLine); 
    builder.redirectErrorStream(true); 
    Process p = null; 
    try { p = builder.start(); } 
    catch (IOException e) { e.printStackTrace(); } 

    BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = new String(); 
    while (true) { 
     try { 
      line = r.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (line == null) { break; } 
     System.out.println("result " + line); 
    } 
} 

Y es Wroked para mí: D

Cuestiones relacionadas