2015-09-04 80 views
1

虽然有几个关于托盘选择的问题,但没有一个与我的问题有关。Java印花托盘选择佐贺

下面是我用打印的代码:

private static void finalPrint(PDDocument pdoc, boolean pbStationary) 
    throws BigBangJewelException 
{ 
    PrintService lrefSvc; 
    PrinterJob lrefPJob; 
    Media lrefMedia; 
    HashPrintRequestAttributeSet lobjSet; 

    lrefSvc = getPrinter(); 

    lrefPJob = PrinterJob.getPrinterJob(); 

    try 
    { 
     lrefPJob.setPrintService(lrefSvc); 
     lrefPJob.setPageable(pdoc); 

     lrefMedia = null; 
     if (pbStationary) 
      lrefMedia = getTray(lrefSvc); 
     if (lrefMedia != null) 
     { 
      lobjSet = new HashPrintRequestAttributeSet(); 
      lobjSet.add(lrefMedia); 
      lrefPJob.print(lobjSet); 
     } 
     else 
      lrefPJob.print(); 
    } 
    catch (Throwable e) 
    { 
     throw new BigBangJewelException(e.getMessage(), e); 
    } 
} 

private static PrintService getPrinter() 
    throws BigBangJewelException 
{ 
    String lstrPrinter; 
    PrintService[] larrServices; 
    int i; 

    try 
    { 
     lstrPrinter = (String)Engine.getUserData().get("Printer"); 

     larrServices = PrinterJob.lookupPrintServices(); 

     for (i = 0; i < larrServices.length; i++) 
     { 
      if (larrServices[i].getName().indexOf(lstrPrinter) != -1) 
       return larrServices[i]; 
     } 
    } 
    catch (Throwable e) 
    { 
     throw new BigBangJewelException(e.getMessage(), e); 
    } 

    throw new BigBangJewelException("Impressora definida (" + lstrPrinter + ") não encontrada."); 
} 

private static Media getTray(PrintService prefSvc) 
{ 
    Media[] larrMedia; 
    String lstrAux; 
    int i; 

    larrMedia = (Media[])prefSvc.getSupportedAttributeValues(Media.class, null, null); 

    if (larrMedia == null) 
     return null; 

    for (i = 0; i < larrMedia.length; i++) 
    { 
     lstrAux = larrMedia[i].toString().toLowerCase(); 
     if (lstrAux.contains("tray") && lstrAux.contains("3")) 
     { 
      return larrMedia[i]; 
     } 
    } 

    return null; 
} 

莫明其妙的事是,曾经工作此代码。机器上有一堆Xerox打印机,代码可以正确识别想要的打印机和想要的托盘,并且一切都很好用。

然后,有一天,一夜之间,它停止工作。它仍然找到了正确的打印机,但现在,它总是打印到纸盘1

,改变是一个额外的HP打印机添加到机器的唯一的事。

我可以证实,该代码是找到托盘,并将其发送到打印作业,但它变得忽略不计。

同样,也有很多问题,在那里对这个问题,但我的问题是,代码运行良好了四年,然后停止工作,原因不明。

任何人都可以在这个问题上谈一谈?

编辑:新信息:卸载HP打印机使得施乐打印机再次正常工作。为什么安装一个驱动程序会影响Java与另一个驱动程序通信的能力?

编辑2:更多信息:如果我们安装HP全局打印机驱动程序而不是特定的打印机驱动程序,则一切正常。我将不回答这个问题,看看在赏金到期之前是否有人能够提出一个好的解释,然后我将把这个编辑作为答案并接受它。

+1

来自例外的日志等可以是你的“光”...这个代码几乎不可能测试SO –

+0

这是事情,没有例外。该设置只是默默的忽略。 –

+0

我喜欢异常名称'BigBangJewelException',但是做这样的事情是没有意义的:'抛出新的BigBangJewelException(e.getMessage(),e);'。简单地省略第一个参数。 –

回答

1

我们特殊情况的解决方案是更改HP打印机的打印机驱动程序。

本来我们安装了打印机有问题,导致了这一问题的特定的驱动程序。安装惠普全球驱动程序反而使问题消失。

不幸的是,我们不知道为什么。 Jens Schauder的回答包含了如何去寻找的线索。

3

如果我给你问正确的,你的lobjSet内容是不变的,但它的打印结果不同的是,在安装了新的驱动程序。

我检查了代码PnterJob.print(PrintRequestAttributeSet)而感到惊讶,它完全忽略设置属性。

所以我看了看PrintService来自哪里,代码有点冗长,但我猜想它与安装的打印机驱动程序以某种方式交互以创建适当的实例。所以新的驱动程序改变这个,返回一个不同的PrintService。我无法判断这件事发生了什么变化,但如果你可以重新创建这两种情况(看起来你可以),使用调试器来找到代码行为的确切位置应该相当容易变化。

+0

这听起来像个好主意,但不幸的是,这只发生在生产机器上,我无法对其进行调试。我确实看了一下你提到的代码,它的确很长。 +1花时间看看它。 –

+0

嗯,我不希望这个奖金浪费,而且也不像任何人会想出更好的东西,所以,就这样吧。 :) –