2

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. なぜこうなった?コマンド ラインから実行するとプリンターが検出されるのに、それ以外の場合は検出されないのはなぜですか?

また、whoamiJava プログラム内から実行しようとしましたが、ログインしているのと同じユーザー (lprコマンド ラインで実行するのと同じユーザー) として実行していると表示されます。

何か助けはありますか?

4

2 に答える 2

4

コマンドと引数を文字列配列に入れる必要があります

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

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

新しいProcessBuilderクラスを使用することもできます。

于 2012-06-07T10:20:25.267 に答える