我正在开发系统,经常打印报告,并且始终检查打印机的状态(纸上低,缺纸等...)。我已经实现了类,查询打印机文件(/ dev / usb / lp0)的状态,如打印机(Swecoin TTP2030)手册中所写,这里是代码:
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()
无济于事。最糟糕的是,打印机状态查询器不仅会抛出异常,还可以锁定打印机的文件一段时间。它仍然打印,但不适用于询问者。
是否存在在打印时查询打印机文件的方法?或者可能存在如何检查打印机文件是否可用的方法。请帮忙!
P.S。:系统是Ubuntu 12.10
更新:我正在通过DocPrintJob对象进行打印:job.print();
我还尝试打印调用shell命令:
Process p;
p = Runtime.getRuntime().exec("cat output.pdf | lpr");
p.waitFor();
但我面临同样的问题。