如何在Java中检测打印机是否连接到计算机?

3

我正在使用Java的Swing创建一个图形用户界面。我需要使用一个名为“打印”的按钮,该按钮将直接开始打印我设置的文件,而不会打开默认的打印对话框。 我需要先检查我的计算机是否连接了打印机?


1
只是想评论一下,如果这个GUI只是为了你个人使用,那没问题。但是如果你计划让其他人使用它,那么仅仅决定用户使用哪台打印机是不好的设计。可以考虑使用36英寸绘图仪。另外,你的最后一句话是一个陈述句,但结尾有问号。它实际上并不是一个问题。 - Zwergner
刚刚完成了我的答案,检查打印机是否已连接。 - VonC
1个回答

2

可能会使用PrintServiceLookup吗?

该类的实现提供了特定类型打印服务(通常相当于打印机)的查找服务。

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestHashAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
    DocPrintJob pj = pservices[0].createPrintJob();
    //....
}

注意:如果有打印机,则PrintService的数量应至少为1。如果存在实际打印机,则可能至少为2,因为您可以在计算机上安装纯软件打印机。另请参见this thread
根据平台和jdk的不同,它可能会出现some bug,但是否则,以下方法应该至少列出打印机:
import java.awt.print.*;
import javax.print.*;
import javax.print.attribute.*;
import java.text.*;
import javax.print.attribute.standard.*;

public class ShowPrinters {

    public ShowPrinters() {
    }

    public static void main(String[] args) {
        DocFlavor myFormat = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        PrintService[] services =PrintServiceLookup.lookupPrintServices(myFormat, aset);
        System.out.println("The following printers are available");
        for (int i=0;i<services.length;i++) {
            System.out.println("  service name: "+services[i].getName());
        }
    }
}

在这个eclipse代码源中,你可以看到使用PrinterState来检查打印机是否真正连接的情况:
AttributeSet attributes = new HashPrintServiceAttributeSet(
    new PrinterName(printerName, Locale.getDefault()));
PrintService[] services = PrintServiceLookup.lookupPrintServices(
    DocFlavor.SERVICE_FORMATTED.PRINTABLE,
    attributes);
PrintService printService = services[0];
PrintServiceAttributeSet printServiceAttributes = printService.getAttributes();
PrinterState printerState = (PrinterState) printServiceAttributes.get(PrinterState.class);

检查printerState是否不为null。注意:这可能并不总是足够的(请参见此线程)。

是的,我正在这里获取打印机的名称,但我的打印机并没有物理连接到我的计算机上。在继续之前,我该如何先检查它呢? - om.
我认为只要打印机已经在计算机上“安装”了,无论是本地还是网络打印机,它都应该可以通过上述代码使用。我想测试一下,但目前我没有任何可用的选项。 :-) - cjstehno
@VonC你知道为什么即使打印机已经打开且连接成功,printerState状态还是一直为null吗? - whizzzkey
@whizzzkey 不好意思,我不知道。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接