如果我使用命令lp filename
,我有一个工作正常的文件。
该文件是收据影响打印机的ESC / P文件。这有Linux本机CUPS驱动程序,所有这些都有效。
我尝试使用javax.print
API,以便我可以对打印进行更细粒度的控制,并希望保持跨平台兼容,尽管Linux是目标平台。
我已经尝试了人类已知的每个DocFlavor组合以及每种类型的数据类型(InputStream
,byte[]
,Reader
等。
它或者只是忽略print()
命令,或者只是翻出一张白纸。正在运行lp filename
会将其打印出来,所以如何让javax.print
只执行与lp filename
相同的功能?
我没有开始使用javax.print
我可以使用其他“东西”并且可能会开始调查cups4J但是它似乎只会限制我只使用Linux / * nix,这现在可以了但是宁可跨平台解决方案。
我可以在文件上发出lp
系统命令,但是,我需要更细粒度的控制。这些不是我们打印的收据,它们是门票,票价从$ 5.00到$数千美元不等。目前,如果我们检测到打印问题,我们会使交易无效,如果打印任何内容,其无效,我们不会轻易重印,如果客户丢失其副本,大部分时间都会收取打印新副本的费用。哦,这样做的原因是我们将POS系统从Windows更改为Linux,打印机从串口直接访问到通过USB管理的CUPS。这是我的代码不起作用。任何帮助表示赞赏。
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) {
}
答案 0 :(得分:1)
我很适合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 printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build();
PrintRequestResult result = selectedPrinter.print(printJob);