2009-06-19 251 views
4

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

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

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

+0

你有没有考虑使用JNLP?如果不使用PrinterJob时会发生什么printJob = PrinterJob.getPrinterJob(); – Koekiebox 2010-11-26 13:07:28

回答

0

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

+0

我已经改变了设置和使用打印接口还印刷,但现在我必须使用PrintServiceLookup.lookupDefaultPrintService()返回null给我。 – 2009-06-19 06:00:41

2

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

Documentation of the jarsigner tool can be found here.

需要注意的是较新的Java运行时做询问用户是否他(她)允许代码访问打印机,但我发现,无论答案如何,在未签名的JAR文件中的代码将无法访问阻止资源。

1

此代码工作在一个签名的小窗口中有1.7.0_55:

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()); 
} 
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()); 
    } 
}