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」)に設定すると、配列にはこのプリンターのみが含まれます。
そのため、現在はデフォルトのプリンターでのみ印刷できますが、どのプリンターでも印刷できるようにしたいと考えています。
ご協力いただきありがとうございます。
私は同じ問題を抱えていて、解決策を見つけました。私はこれが問題を解決するための最良の方法だとは思わないが、少なくともそれは私のために働いています。
ヘッドレス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にlocalhost接続を提供できない理由がまだわかりません。そのため、私の回避策は、サーバー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());
}
}
}