ネットワーク上にいくつかのウィンドウボックスがあり、それらに共有プリンターがあります。
私はCUPS Webインターフェイスを介してそれらを追加しました。それらはすべて魅力のように機能し、phpでそれらに印刷できます。
exec('lp -d vasosamsung file.pdf');
涼しい。私はPrinter
クラスをワーティングしています。これは、印刷ジョブが開始する前に検証を行うものです。
私がチェックする最初のことはプリンタが存在することです:
lpstat -p vasosamsung
表示されていない場合は、宛先が無効です。はい、次に進みます。そして、ここでトリッキーな部分があります。
答えがアイドル状態、または印刷である場合、すべてが問題ないので、ジョブを送信しましょう。
しかし!
問題は、私のマシンではプリンターがプリンターのリストに追加されているため、プリンターがアイドル状態になっているということですが、残念ながらオフラインです。これは私がキャッチしたいものです。さらに問題が発生します。
プリンター自体がオフライン(マシンから引き出されている)であっても、ジョブはキューにあります。
本当の問題は、右クリックして「プリンターとデバイス」からプリンター全体を削除すると、CUPSはアイドル状態になると言っています。 service cups restart
でCUPSを再起動し、統計を取得しました。
printer vasosamsung is idle. enabled since Thu 06 Apr 2017 03:34:26 PM CEST
それは本当ではない。今私のマシンにはこのようなプリンターがあります。最悪の場合、私がそれにドキュメントを送信すると、次のようになります。
string(40) "request id is vasosamsung-71 (1 file(s))"
そして仕事はウェブインターフェース上にあります:
vasosamsung-71 Unknown Withheld 1933k 1 held since
2017年4月6日(木)15:59:43
私の質問は、物理プリンタのステータスを取得する方法はありますか?オフライン、印刷など... CUPSからではありませんか?
それが不可能な場合、どういうわけか私は得ることができます、プリンタは少なくともターゲットマシンのデバイスリストにありますか?
[〜#〜]編集[〜#〜]
へへ、私がマシンをオフにすると、プリンターもアイドル状態になります:)
これは、vasosamsungプリンターがCUPSにあり、それがフィスカルデバイスではないためだと思いますが、今はわかりますが、私の質問はまだ生きています。
lpstat
を-t
パラメータと共に使用します。
$ lpstat -t
scheduler is running
system default destination: DCP-7065DN
device for DCP-7065DN: usb://Brother/DCP-7065DN?serial=<REDACTED>
DCP-7065DN accepting requests since Tue 19 Nov 2019 04:29:56 PM MST
printer DCP-7065DN is idle. enabled since Tue 19 Nov 2019 04:29:56 PM MST
システムは、プリンターが要求を受け入れていることを知らせます(「Good to go」など)。
私の解決策:Cで記述されたプログラムに関数(または1964年の私の最初の言語であるALGOLのプロシージャ)を含めます...
#define BUFFERLEN 1024
int isprtready( void )
{ char cmd[BUFFERLEN], buffer[BUFFERLEN], usbstat[]="lsusb > ",
enabled[]="Hewlett-Packard LaserJet 2420", filename[]="prtreadyXXXXXX";
int handle, len;
handle = mkstemp( filename );
strcpy( cmd, usbstat );
strcat( cmd, filename );
system( cmd );
len = read( handle, buffer, BUFFERLEN );
buffer[len] = '\0';
close( handle );
unlink( filename );
return ( strstr( buffer, enabled ) != (char*)NULL );
}
必要なものが含まれています
欠点:明示的なプリンター名がプログラムに含まれています。 (私は1台のコンピューターと1台のプリンターしかなく、ネットワークなどはありません。)