Как использовать Java для печати на сетевом принтере?
Используя Java, мне нужно печатать на сетевом принтере, который не установлен локально. Я знаю только имя принтера. Все учебники, которые я видел, начинались с чего-то вроде:
PrintService []services = PrinterJob.lookupPrintServices();
Проблема в том, что не может быть никаких установленных принтеров, поэтому в этом случае службы будут пусты. Мне нужно установить имя принтера напрямую, а не просто перечислять через видимые принтеры.
2 ответа
Java AWT Printing не найдет принтер по пути, если он не зарегистрирован для пользователя Windows / Active Directory, на котором запущено приложение печати. Вы должны зарегистрировать путь к принтеру через Windows "Устройства и принтеры" в качестве принтера для того пользователя, чтобы он был виден. Тогда ты должен бежать lookupPrintServices
чтобы увидеть список доступных принтеров и получить нужные PrintService
точным именем String
в списке.
/**
* 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;
}
}
}
В моем случае произошла ошибка аутентификации, я не смог найти общий принтер, потому что я искал их с учетной записью LocalUser, используя другую учетную запись или меняя разрешения на принтер, которые я мог найти.