2015-09-04 2 views
1

Хотя есть несколько вопросов относительно выбора лотка, ни одна из них не связана с моей проблемой.Выбор лотка для печати в формате Java Saga

Вот код, я использую для печати:

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 вместо конкретного драйвера принтера, все работает правильно. Я оставлю вопрос без ответа, чтобы узнать, может ли кто-нибудь придумать хорошее объяснение до того, как истекает срок, и я отправлю это изменение в ответ и приму его.

+1

Журналы исключений и т. Д. Могут быть вашими «легкими» ...этот код почти невозможно проверить для людей из SO –

+0

Это то, что нет исключений. Настройка просто игнорируется. –

+0

Мне нравится имя исключения 'BigBangJewelException', но совершенно бессмысленно делать что-то вроде этого:' throw new BigBangJewelException (e.getMessage(), e); '. Просто опустите первый аргумент. –

ответ

1

Решение нашей конкретной ситуации состояло в том, чтобы изменить драйверы принтера для принтера HP.

Первоначально мы установили конкретный драйвер для рассматриваемого принтера, что вызвало такое поведение. Вместо этого установка глобального драйвера HP заставила проблему уйти.

К сожалению, мы не знаем почему. Ответ Йенса Шаудера содержит подсказки о том, как разобраться.

3

Если у вас есть вопрос правильно, то содержимое lobjSet не изменится, но результат печати отличается от нового установленного драйвера.

Я проверил код для PnterJob.print(PrintRequestAttributeSet) и был удивлен, что он полностью игнорирует набор атрибутов.

Итак, я посмотрел, откуда приходит PrintService, код немного длинный, но я думаю, что он каким-то образом взаимодействует с установленными драйверами принтера для создания соответствующих экземпляров. Таким образом, новый драйвер меняет это, возвращая другой PrintService. Я никак не могу сказать, каким образом эта вещь меняется, но если вы можете воссоздать оба сценария (и, похоже, это возможно), должно быть довольно легко использовать отладчик, чтобы найти точное место, где поведение кода изменения.

+0

Это звучит неплохо, но, к сожалению, это происходит только на производственной машине, и я не могу отлаживать ее. Я взглянул на код, который вы упомянули, и он действительно длинный. +1 для поиска времени, чтобы посмотреть на него. –

+0

Ну, я не хочу, чтобы эта щедрость пропала даром, и не похоже, что кто-то придумает что-нибудь лучшее, так что, будь у нее. :) –