使用 CUPS 进行 Java 打印:未找到打印机

使用 CUPS 进行 Java 打印:未找到打印机

我正在尝试在 Ubuntu(16.04)上设置 Tomcat 服务器(8.5.5.0,Java 1.8.0_101),并在 Windows 打印服务器上打印到共享打印机。

我已经成功使用 CUPS (2.1.3) 和 SAMBA (4.3.11) 配置了几台打印机。从命令行打印工作正常。

在我的 Java 应用程序中,当我尝试查找如下打印机时:

PrintService[] ps = PrintServiceLookup.lookupPrintServices(null, null);

它返回一个空数组。但如果我将打印机设置为默认打印机(/etc/cups/printers.conf 中的“DefaultPrinter”),则数组仅包含此打印机。

所以目前我只能打印到默认打印机,但我希望能够打印到任何打印机。

感谢您的帮助。

答案1

我遇到了同样的问题,刚刚找到了解决方案。我不认为这是解决问题的最佳方法,但至少对我来说是有效的。

我第一次发现这个问题是在尝试在无头 Ubuntu 16.04 服务器上设置 CUPS 服务时。在我的桌面 Ubuntu 16.04 上,即使没有设置默认打印机,查找打印机也能正常工作。经过进一步调查,我发现问题发生在我更改 CUPS 配置以启用远程管理之后。

原始配置来自cupsd.conf

# Only listen for connections from the local machine
Listen localhost:631
Listen /var/run/cups.sock

修改配置以启用远程管理(不起作用):

# Only listen for connections from the local machine
Listen *:631
Listen /var/run/cups.sock

看起来 Java 需要使用 localhost 连接到 CUPS 服务,因此要启用远程管理并为 Java 提供 localhost 连接:

# Only listen for connections from the local machine
Listen localhost:631
Listen /var/run/cups.sock
Listen 192.168.0.100:631

我仍然不明白为什么使用Listen *:631不能为 Java 提供本地主机连接,所以我的解决方法是添加配置来监听我的服务器 IP 地址。

这是我用来查询 CUPS 打印机的 Java 代码

public class TestPrinter {
    public static void main(String[] args) {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        System.out.println("Number of print services: " + printServices.length);

        System.out.println("Available printer: ");
        PrintService mPrintService = null;        
        for (PrintService printer : printServices) {
            System.out.println(printer.getName());
        }

        PrintService defaultPrinter = PrintServiceLookup.lookupDefaultPrintService();
        if (defaultPrinter != null) {
            System.out.println("Default printer: " + defaultPrinter.getName());        
        }
    }   
}

相关内容