Я хочу реализовать функцию, в которой приложение проверяет, находится ли принтер в сети, прежде чем отправлять задание на печать, чтобы, если принтер находится в автономном режиме, пользователь (кассир) получал предупреждение и заказ не терялся.
В настоящее время я использую PrintServiceLookup.lookupPrintServices() в Java, чтобы получить принтер по имени, но я не могу надежно определить, находится ли принтер в сети. Имя принтера определяется правильно, но информация о состоянии отсутствует.
Я рассмотрел:
- Использование WMIC или запрос порта принтера Windows → не работает надежно для этого принтера.
- Отправка небольшого тестового отпечатка, чтобы проверить, доступен ли принтер → работает, но мне интересно, есть ли более чистый способ.
- Есть ли в Java способ проверить онлайн-/оффлайн-статус сетевого POS-принтера по имени?
- Есть ли способ надежно получить IP-адрес принтера из Java, если известно только имя принтера?
- Существуют ли какие-либо рекомендации для принтеров POS Ethernet для проверки подключения перед печатью?
Заранее спасибо!
Моя функция печати
public static void printToPOSInvoice(ObservableList
printRules, long orderHeader_id, Preferences preferences) {
System.out.println("Print to pos");
// Checking if POS printing is enabled at all
if (!preferences.getBoolean(Functions.POSSTATUS, false)) {
return; // Exit if POS is disabled
}
try {
OrderHeader aos = OrderHeaderService.orderHeaderService.getById(orderHeader_id);
Table tempTable = TablesServices.tablesServices.getById(aos.getTable_id());
if (tempTable == null) {
tempTable = new Table(0, "", 0, "", 1, "");
}
final Table table = tempTable;
Map groupsToPrint =
PrintGroupService.groupItemsByPrinter(printRules, CartFunctions.cartList);
// WE START WITH THE ITERATION FOR PRINTING
groupsToPrint.forEach((printerName, items) -> {
try {
// 1. CHECKING THE EXISTENCE OF A PRINTER
PrintService service = PrintRulesService.getPrintServiceByName(printerName);
if (service == null) {
throw new RuntimeException(
"Printer '" + printerName + "' is not found. Check name or driver."
);
}
System.out.println("Printer is found: " + printerName);
// --- Text and data generation ---
String text = PrintRulesService.printRulesService.generatePrintTextInvoice(aos, items);
byte[] data = PrintRulesService.concat(
PrintRulesService.INIT,
PrintRulesService.ALIGN_CENTER,
PrintRulesService.LARGE_ON,
PrintRulesService.BOLD_ON,
PrintRulesService.text("==== NARUDZBA ====\n"),
// ... other data (abbreviated for clarity) ...
PrintRulesService.text(text),
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.ALIGN_CENTER,
QRGenerator.generateQRForOrder(aos, null),
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.ALIGN_CENTER,
PrintRulesService.text("==== Hvala! ====\n"),
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.LF,
PrintRulesService.CUT
);
// ----------------------------------------------------
// 3) Sending bytes to POS printer
PrintRulesService.printBytes(printerName, data);
} catch (RuntimeException re) {
// Catches errors when searching for printers
Dialogs.showOKDialog(
PrintRulesService.class,
"Preparation Error",
"An error occurred while preparing the print job for '" + printerName + "':\n" + re.getMessage()
);
} catch (Exception e) {
// Catches all I/O and PrintService errors from PrintRulesService.printBytes(printerName, data)
Dialogs.showOKDialog(
PrintRulesService.class,
"Error from POS printer: " + printerName,
"**Printer is OFFLINE or unavailable!**\n\n An error occurred while printing to '" + printerName + "':\n" + e.getMessage() );
}
}); //
} catch (Exception e) {
// Catch errors outside the loop (e.g., retrieving OrderHeader or TablesServices)
Dialogs.showOKDialog(
PrintRulesService.class,
"General System Error",
"A general error occurred before printing.:\n" + e.getMessage()
);
}
}
И функция printBytes:
public static void printBytes(String printerName, byte[] bytes) {
try {
// 1. Get a printer
PrintService service = getPrintServiceByName(printerName);
//
if (service == null) {
System.out.println("Printer '" + printerName + "' not found or not ON.");
throw new RuntimeException("Printer '" + printerName + "' not found or not ON.");
}
// 2. Preparing for printing
DocPrintJob job = service.createPrintJob();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
Doc doc = new SimpleDoc(bytes, flavor, null);
// 3. try print
job.print(doc, null);
} catch (Exception e) {
System.out.println(e.getMessage());
//
throw new RuntimeException("Error sending data to POS printer: " + e.getMessage(), e);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... er-in-java
Мобильная версия