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