使用javax.print通过杯子打印

9 java printing

如果我使用该命令,我有一个工作正常的文件lp filename.

该文件是收据影响打印机的ESC/P文件.这有Linux本机CUPS驱动程序,所有这些都有效.

我试图使用javax.printAPI,以便我可以对打印进行更精细的控制,并希望保持跨平台兼容,尽管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) {
}
Run Code Online (Sandbox Code Playgroud)

Fal*_*ger 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个打印作业并将其发送到打印机

 PrintJob printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build();
    PrintRequestResult result = selectedPrinter.print(printJob);
Run Code Online (Sandbox Code Playgroud)