Печать через чашки с использованием javax.print - PullRequest
9 голосов
/ 24 августа 2011

У меня есть файл, который прекрасно работает, если я использую команду lp filename.

Этот файл представляет собой файл ESC / P для принтера, влияющего на получение чеков.Это родные драйверы Linux CUPS и все это работает.

Я пытаюсь использовать API javax.print, чтобы я мог иметь более точный контроль над печатью и, надеюсь, поддерживать его кросс-платформенную совместимость, хотя Linux является целевой платформой.

Iпробовал каждую комбинацию DocFlavor, известную человеку, и каждый тип данных (InputStream, byte[], Reader и т. д.)

Он либо просто игнорирует команду print() все вместе, либо просто переворачиваетиз чистого листа бумаги.Запуск lp filename печатает его идеально, так как же заставить javax.print просто сделать функциональный эквивалент lp filename?

Я не настроен на использование javax.print Я могу использовать другие «вещи»и мог бы начать исследовать cups4J, но, похоже, это ограничит меня только Linux / * nix, что пока нормально, но скорее будет кросс-платформенное решение.

Я мог бы просто ввести системную команду lp для файла, но мне нужен более точный контроль.Это не квитанции, которые мы печатаем, это билеты, и билеты варьируются от 5 до тысяч долларов.В настоящее время, если мы обнаруживаем проблему с печатью, мы аннулируем транзакцию и, если что-то напечатано, она недействительна, мы не берем на себя перепечатки и большую часть времени берем на печать новой копии, если клиент теряет свою копию.О причина этого заключается в том, что мы меняем систему POS с Windows на Linux, а принтеры с прямого доступа через последовательные порты на CUPS, управляемые через USB.Вот мой код, который не работает.Любая помощь приветствуется.

try {
    // Find the default service
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

    PrintService service = PrintServiceLookup.lookupDefaultPrintService();

    // Create the print job
    DocPrintJob job = service.createPrintJob();
    InputStream in = new FileInputStream("/home/bart/real.escp");
    Doc docNew = new SimpleDoc(in,flavor,null);

    // Monitor print job events; for the implementation of PrintJobWatcher,
    // see Determining When a Print Job Has Finished
    PrintJobWatcher pjDone = new PrintJobWatcher(job);

    // Print it
    job.print(docNew, null);

    // Wait for the print job to be done
    pjDone.waitForDone();

    // It is now safe to close the input stream
    in.close();
} catch (PrintException e) {
} catch (IOException e) {
}

1 Ответ

1 голос
/ 04 декабря 2016

Я в порядке с cups4j. Сначала возьмите свой принтер.

try { 
        CupsClient client = new CupsClient("addressOfTheCupsServer", 631);
        List<CupsPrinter> printers = client.getPrinters();
        if (printers.size() == 0) {
            throw new RuntimeException("Cant list Printer");
        }
        for (CupsPrinter cupsPrinter : printers) {
            if (cupsPrinter.getName().equals("NameOfPrinter")) {
                selectedPrinter = cupsPrinter;
            }
        }
    }catch (Exception ignored){
        ignored.printStackTrace();
    }
}

Затем создайте задание на печать и отправьте его на принтер

 PrintJob printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build();
    PrintRequestResult result = selectedPrinter.print(printJob);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...