У меня есть файл, который прекрасно работает, если я использую команду 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) {
}