How to use Java to print on a network printer?

Using Java, I need to print to a network printer that is not installed locally. I only know the name of the printer. All the tutorials I've seen started with something like:

PrintService []services = PrinterJob.lookupPrintServices();

The problem is that printers are not installed, so in this case the services will be empty. I need to set the printer name directly, and not just list through visible printers.

+5
source share
2 answers

Java AWT Printing will not find the printer along the path if it is not registered for the Windows / Active Directory user running the print application. You must register the printer path through Windows "Devices and Printers" as the printer for this user, so that it is visible. Then you must run lookupPrintServices to see the list of available printers and get the correct PrintService using the exact String name.

 /** * 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; } } } 
+8
source

In my case, there was an authentication error, I could not find a shared printer because I searched for them using the LocalUser account, using a different account, or changing the printer permissions that I could find.

0
source

Source: https://habr.com/ru/post/982329/


All Articles