PrintServiceLookup.lookupDefaultPrintService()返回null

时间:2009-06-19 04:48:28

标签: java printing applet

PrintServiceLookup.lookupDefaultPrintService()返回NULL,因为我安装了打印机并设置为默认打印机。

如果我在一个简单的程序中使用它,它可以正常工作,但是当我尝试在基于applet的程序中使用它时,它会返回NULL

请给我一些解决这个问题的好方法。

4 个答案:

答案 0 :(得分:2)

为了访问打印机(或主机上的任何资源),必须对applet代码所在的jar文件进行签名,并且用户必须接受签名者作为可信方。 要签署jar文件,请使用jarsigner程序,它是JDK的一部分。 Jarsigner使用自己的密钥库,因此如果您拥有自己的证书,则必须先将证书导入密钥库。它也可以生成证书,如果你没有任何其他证书来签署jar文件。

Documentation of the jarsigner tool can be found here.

请注意,较新的Java运行时会询问用户是否允许代码访问打印机,但我发现无论答案如何,都会阻止未签名的jar文件中的代码访问资源。

答案 1 :(得分:1)

此代码在带有1.7.0_55的Windows中已签名的小程序中运行:

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;

...

HashDocAttributeSet docAttr=new HashDocAttributeSet();
HashPrintRequestAttributeSet reqAttr=new HashPrintRequestAttributeSet();

try {
    PrintService pserv = PrintServiceLookup.lookupDefaultPrintService();
    if (pserv == null) {
        System.out.println("ERROR-01: no default print service");
    }
    System.out.println("Printer: " + pserv.getName());

    DocPrintJob job = pserv.createPrintJob();
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    String content = makeZplLabel();
    Doc doc = new SimpleDoc(content.getBytes(), flavor, docAttr);

    job.print(doc, reqAttr);

} catch (Exception e) {
    System.out.println("ERROR-02:" + e.getMessage());
}

答案 2 :(得分:0)

您必须先更改Java小程序的安全设置。默认情况下,java applet无法打印。

答案 3 :(得分:0)

确保printer.conf定义<DefaultPrinter name>而不是<Printer name>。 JVM似乎只找到一个这样定义的默认打印机。

此代码段有助于快速验证其是否有效:

import javax.print.PrintServiceLookup;

public class checkDefaultPrinter {
    public static void main(String[] args) {
        System.out.println(PrintServiceLookup.lookupDefaultPrintService());
    }
}