Java Printing Tray Selection Saga

时间:2015-09-04 11:06:26

标签: java printing tray

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

这是我用来打印的代码:

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打印机使Xerox打印机再次正常工作。为什么安装一个驱动程序会影响Java与不同驱动程序通信的能力?

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

2 个答案:

答案 0 :(得分:3)

如果我正确地提问您,lobjSet的内容未更改,但打印结果不同,安装了新驱动程序。

我检查了PnterJob.print(PrintRequestAttributeSet)的代码,并惊讶于它完全忽略了属性集。

所以我查看了PrintService的来源,代码有点冗长,但我想它会以某种方式与安装的打印机驱动程序进行交互以创建适当的实例。因此,新驱动程序会更改此设置,返回不同的PrintService。我无法确定这个东西改变的确切方式,但是如果你可以重新创建两个场景(而且似乎你可以),那么使用调试器找到代码行为的确切位置应该相当容易变化。

答案 1 :(得分:1)

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

最初,我们已经为相关打印机安装了特定的驱动程序,这导致了这种行为。安装HP的全局驱动程序反而使问题消失了。

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