打印(使用lpr)可以从命令行运行,但不能从Java运行

时间:2012-06-07 10:12:49

标签: java printing

所以,首先,我们不能使用javax打印服务,因为它非常慢,因为我们在一台机器上安装了超过20,000台打印机(查找使用的lpstat非常慢)。所以,我们正在使用lpr。

当我这样做时:

cat myfile.pdf | lpr -P "MyPrinter"

它将文件完美打印到打印机名称MyPrinter。要在Java中做同样的事情,我这样做:

cmd = String.format("lpr -P \"%s\"", "MyPrinter");

Process p = Runtime.getRuntime().exec(cmd);

OutputStream out = p.getOutputStream();

/*
 This essentially runs a thread which reads from a stream and
 outputs it to the STDOUT. This is what I've written to help with
 debugging
*/
StreamRedirect inRed = new StreamRedirect(p.getInputStream(), "IN");
StreamRedirect erRed = new StreamRedirect(p.getErrorStream(), "ER");

inRed.start();
erRed.start();


/*
 This is where I write to lprs STDIN. `document` is an InputStream
*/

final byte buf[] = new byte[1024];
int len;

while((len = document.read(buf)) > 0) {
    out.write(buf, 0, len);
}

out.flush();
out.close();

但是,我收到以下错误:

SR[ER]>>lpr: The printer or class was not found.

此处,SR[ER]只是一个以StreamRedirect为前缀的自定义标签。为什么会这样?当我从命令行运行打印机时为什么能够找到打印机,但不是这样?

此外,我尝试在Java程序中运行whoami并且它说我以与我登录的用户相同的方式运行它(与我执行lpr的用户相同命令行)。

任何帮助?

2 个答案:

答案 0 :(得分:3)

您需要将命令和参数放在字符串数组

String[] cmd = new String[] { "lpr" , "-P", "MyPrinter" };

Process p = Runtime.getRuntime().exec(cmd);

您可能还想使用较新的ProcessBuilder类。

答案 1 :(得分:0)

cups-bsd包括lpr,该Java与Java一起使用。

请务必执行apt-get remove lprapt-get install cups-bsd