【问题标题】:Printing via cups using javax.print使用 javax.print 通过杯子打印
【发布时间】:2011-08-24 18:26:58
【问题描述】:

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

该文件是用于收据冲击式打印机的 ESC/P 文件。这有 linux 原生 CUPS 驱动程序和所有工作。

我正在尝试使用javax.print API,以便我可以对打印进行更精细的控制,并希望保持跨平台兼容,尽管 Linux 是目标平台。

我已经尝试了人类已知的每种 DocFlavor 组合以及每种类型的数据类型(InputStreambyte[]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) {
}

【问题讨论】:

  • 在 Linux 上从 Java 打印充其量是冒险的。我已经开始使用 lpr 命令在命令行中进行一些打印。一种选择可能是查看您是否可以将文件转换为 Java 可以理解的格式,例如 PDF,然后在其上使用 javax.print。
  • 这就是问题所在,可能有一个 linux esc/p 转换器,但是当 lp 命令打印正常时为什么还要麻烦,似乎从 ESC/P 找麻烦(可以直接馈送到打印机) ->PDF(让 Java 快乐)->ESC/P(通过驱动程序)。我们正在生成 ESC/P 文件。无论如何,与 Cups4J 配合得很好,实施大约需要 15 分钟。我想我会使用 cups4J 并在它们弹出时处理任何其他操作系统/打印系统问题。

标签: java printing


【解决方案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 = new PrintJob.Builder(inputStream).jobName("Jobname").build();
    PrintRequestResult result = selectedPrinter.print(printJob);

【讨论】:

  • 这对我有用,但我尝试打印一个 byte[] 数组,导致打印符号有问题。我必须仅通过 CUPS 服务器将打印机设置为 pdf 并且它可以工作。不知能否通过代码配置字节数组为pdf。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多