私は、レポートを頻繁に印刷するシステムを開発しており、常にプリンターのステータスをチェックしています(用紙が少ない、用紙がないなど...)。プリンター (Swecoin TTP2030) マニュアルに書かれているように、プリンター ファイル (/dev/usb/lp0) のステータスを照会するクラスを実装しました。コードは次のとおりです。
public class PrinterStatusEnquier {
private static Logger logger = Logger.getLogger(PrinterStatusEnquier.class);
private static byte[] PAPER_NEAR_END_ENQUIRY = {0x1B, 0x05, 0x02};
private static byte[] STATUS_ENQUIRY = {0x1B, 0x05, 0x01};
private static String PRINTER_DEVICE =
PropertiesManager.getInstance().getApplicationProperty("printer.device.file");
public static PaperStatus enquiryPaperStatus() throws IOException {
logger.debug("In method enquiryPaperStatus()...");
RandomAccessFile device = null;
try
{
device = new RandomAccessFile(PRINTER_DEVICE, "rw");
device.write(PAPER_NEAR_END_ENQUIRY);
int response = device.readByte();
return PaperStatus.getStatus(response);
} catch (IOException e) {
logger.error("Error while opening file: " + e.getMessage());
e.printStackTrace();
throw e;
} finally {
if (device != null) {
logger.debug("Closing file...");
device.close();
}
}
}
public static PrinterStatus enquiryPrinterStatus() throws IOException {
logger.debug("In method enquiryPrinterStatus()...");
RandomAccessFile device = null;
try {
device = new RandomAccessFile(PRINTER_DEVICE, "rw");
device.write(STATUS_ENQUIRY);
byte[] response = new byte[2];
device.read(response);
return PrinterStatus.getStatus(response);
} catch (IOException e) {
logger.error("Error while opening file: " + e.getMessage());
e.printStackTrace();
throw e;
} finally {
if (device != null) {
logger.debug("Closing file...");
device.close();
}
}
}
私のシステムでは、このコードはうまく機能します。しかし、システムに統合すると、多くの IOExceptions が発生し始めます。プリンターが何かを印刷するときに発生することに気付き、この瞬間にステータスを取得しようとしました。例外が発生する場合があります (ファイルが見つかりません)。この場合、そのようなプリンター ファイルを確認できますfile.canWrite()
。file.canWrite()
ヘルプ。最悪なのは、プリンタ ステータス エンクワイアが例外をスローするだけでなく、プリンタのファイルをしばらくの間ロックする可能性があることです。それはまだ印刷されますが、照会者には利用できません。
印刷中にプリンターファイルを照会する方法はありますか? または、プリンターファイルが利用可能かどうかを確認する方法が存在する可能性があります。助けてください!
PS: システムは Ubuntu 12.10 です
Updae: DocPrintJob オブジェクトを介して印刷しています:job.print();
また、シェル コマンドを呼び出して印刷しようとしました:
Process p;
p = Runtime.getRuntime().exec("cat output.pdf | lpr");
p.waitFor();
しかし、私は同じ問題に直面しました。